In neuer Belegefassung eine bestimmte Position anzeigen

Hi Vitali,

danke für deine Antwort.

Ich habe jetzt folgen den Code in der DCM VKBelegProxyServiceCall ausgeführt:

foreach (var pos in positionen)
{
pos.Bag.ShortValues[DataServiceContext.IsSelectedTag] = 0;

if (pos == foundPosition)
{
beleg.DcmProperties.ShortValues["SetFocus"] = 1;
beleg.DcmProperties.StringValues["FocusUuid"] = pos.Bag.StringValues[DataServiceContext.UuidTag];
pos.Bag.ShortValues[DataServiceContext.UuidTag] = -1;
}
}

Der Fokus wechselt nicht und es wird folgende Fehlermeldung ausgegeben:

"Die Anfrage konnte nicht ausgeführt werden, weil ein interner Fehler aufgetreten ist."

Mach ich da etwas falsch?
 
Guten Morgen,

hier die ganze Funktion so wie ich sie aufgebaut habe:

public static void BPKSuchePosition(DcmContextBelegProxyServiceCall context)
{
//Parameter 3 abfragen
var positionsnummer = Sagede.Core.Tools.Expression.GetParameter(context.NamedParameters[2].Value, "PosNr");

if (string.IsNullOrWhiteSpace(positionsnummer))
return;

foreach (var pos in context.Beleg.Positionen)
{
pos.Bag.ShortValues[DataServiceContext.IsSelectedTag] = 0;

if(pos.Positionsnummer == positionsnummer)
{
context.Beleg.DcmProperties.ShortValues["SetFocus"] = 1;
context.Beleg.DcmProperties.StringValues["FocusUuid"] = pos.Bag.StringValues[DataServiceContext.UuidTag];
pos.Bag.ShortValues[DataServiceContext.IsSelectedTag] = -1;
}

}
}

Wenn weiterhin Fehler auftreten, dann schauen Sie ob ein Fehler in Tracelog-Manager registriert wird.
 
Danke, daran habe ich schon gedacht. Es hatte sich aber ein anderer Fehler beim übertrage meines Codes eingeschlichen.
Mein Code sieht jetzt folgendermaßen aus:

foreach (var pos in positionen)
{
pos.Bag.ShortValues[DataServiceContext.IsSelectedTag] = 0;

if (pos == foundPosition)
{
beleg.DcmProperties.ShortValues["SetFocus"] = 1;
beleg.DcmProperties.StringValues["FocusUuid"] = pos.Bag.StringValues[DataServiceContext.UuidTag];
pos.Bag.ShortValues[DataServiceContext.IsSelectedTag] = -1;
}
}

Das Ergebnis ist jetzt folgendermaßen:

Vor dem Aufruf:
upload_2018-12-14_14-1-51.png

Nach dem Aufruf:
upload_2018-12-14_14-2-20.png

Wie gewünscht ist nun die erste Zeile als gewählt markiert. Der Fokus liegt aber immer noch auf der zweiten Zeile. Kann man das auch noch ändern?
 
versuche in dieser Zeile (beleg.DcmProperties.ShortValues["SetFocus"] =1 ) -1 statt 1 zu setzen.
Etwa so: beleg.DcmProperties.ShortValues["SetFocus"] = -1;

Habe es nicht ausprobiert, ist nur eine Vermutung...
 
Es muss noch der DCM-Aufruf "VKBelegProxyBelegToContainer" eingefügt werden.
In diesem muss die folgender Code noch eingefügt werden:

RepresentationInformationTagsManager tags = new RepresentationInformationTagsManager(context.DataContainer);

if (context.Beleg.DcmProperties.ExistParameter("SetFocus") && context.Beleg.DcmProperties.ExistParameter("FocusUuid") && context.Beleg.DcmProperties.ShortValues["SetFocus"] == -1 )

{
if (!String.IsNullOrWhiteSpace(context.Beleg.DcmProperties.StringValues["FocusUuid"]))
{
var guid = new Guid(context.Beleg.DcmProperties.StringValues["FocusUuid"]);

tags.SetFocussedCellParams.Add(new Sagede.Shared.RealTimeData.Common.Utilities.SetFocussedCellParam
{
FocusedFieldname = "Positionen",
FocusedUUID = Guid.Parse(context.Beleg.DcmProperties.StringValues["FocusUuid"]),
FocusedColumnname = "Artikelnummer"
});

tags.Build(context.DataContainer);
}
}

Als Referenzen müssen die beiden dll's " Sagede.Shared.RealTimeData.Common" und " Sagede.Shared.ServiceModel" eingefügt werden.
 
Danke,

das funktioniert soweit ganz gut. Zumindest, wenn ich den Fokuswechsel in einem ServiceCall setzen will.

Jetzt habe ich aber noch einen Fall, bei dem ich mit einem AppLibraryCall arbeite.
Gibt es da auch einen Weg?
 
Geht leider nicht via direktem AppLibraryCall. Ich habe einen AppLibraryCall mit einem anschließenden DataServiceExecute kombiniert, um zu einer Position zu springen.

Ergänzung zum obigen Code:
Die Methode mit DataServiceExecute funktioniert nur mit der Option "Vollstaendig:Ersetzen". Hierbei sei allerdings anzumerken, dass das Flag [_IsDirty] damit auf TRUE springt, ergo der Beleg wieder gespeichert werden kann.
Wenn es sich allerdings wie bei uns um eine Positionssuche handelt, soll der Beleg "unberührt" bleiben. Hierfür kann man im Makro folgende zwei Zeilen verwenden:

Vor der Ausführung via DataServiceExecute:
Code:
FestlegenLokaleVar        |        [_IsDirtyTemp]    |        [_IsDirty]
Nach der Ausführung via DataServiceExecute:
Code:
FestlegenLokaleVar        |        [_IsDirty]        |        [_IsDirtyTemp]
 
Schauen Sie bitte auch in den WDB-Eintrag 203334. Das Dokument "Zusatzdokumentation zum Wiki für Developer Partner" wurde im Kapitel DataServiceBase erweitert (z.B. mit dem Kapitel "Die Darstellung der Daten im Client steuern").
 
Es muss noch der DCM-Aufruf "VKBelegProxyBelegToContainer" eingefügt werden.
In diesem muss die folgender Code noch eingefügt werden:

RepresentationInformationTagsManager tags = new RepresentationInformationTagsManager(context.DataContainer);

if (context.Beleg.DcmProperties.ExistParameter("SetFocus") && context.Beleg.DcmProperties.ExistParameter("FocusUuid") && context.Beleg.DcmProperties.ShortValues["SetFocus"] == -1 )

{
if (!String.IsNullOrWhiteSpace(context.Beleg.DcmProperties.StringValues["FocusUuid"]))
{
var guid = new Guid(context.Beleg.DcmProperties.StringValues["FocusUuid"]);

tags.SetFocussedCellParams.Add(new Sagede.Shared.RealTimeData.Common.Utilities.SetFocussedCellParam
{
FocusedFieldname = "Positionen",
FocusedUUID = Guid.Parse(context.Beleg.DcmProperties.StringValues["FocusUuid"]),
FocusedColumnname = "Artikelnummer"
});

tags.Build(context.DataContainer);
}
}

Als Referenzen müssen die beiden dll's " Sagede.Shared.RealTimeData.Common" und " Sagede.Shared.ServiceModel" eingefügt werden.
Hallo Herr Gehlmann,

der Beitrag ist zwar schon 3 Jahre alt, aber es ist der einzige bei dem ich einen Hinweis auf die Sagede.Shared.Servicemodel gefunden habe. Ist diese in den Versionen 8.1.2 und flg. ersetzt worden? Konkret wollen wir eine PDF-erzeugen, die automatisch im Hintergrund versandt und in bestimmten Verzeichnissen als Kopie abgelegt wird. Im Entwicklerhandbuch findet man unter Punkt 11.3 ein entsprechendes Beispiel. Nur die Sagede.Shared.Servicemodel.dll ist in keinem der Sage-Programmverzeichnisse zu finden.

Mit freundlichen Grüßen
Uwe Rex
 
Hallo,
die Datei liegt im Assemly Ordner von Windows und nicht im Shared. Wenn die PDF-Erstellung für die Druckbelege sein soll, sollte dies mit der DCM "ReportBeforeSaveToDms" erfolgen.
 
Zurück
Oben