[fast gelöst] Webservice und XMLPort II

30. Januar 2013 12:47

Hi,

wie kann ich denn verhindern dass ein XMLPort Daten übermittelt?

Folgende Prozedur wird in einer Codeunit als Webservice veröffentlicht.

Code:
PROCEDURE CustGetRecordLinks@1000000000(CustomerNo@1000000002 : Code[20];VAR recXML@1000000000 : XMLport 50001;VAR totalrec@1000000001 : Integer;VAR mytotal@1000000003 : Integer);
    BEGIN
      cust.SETRANGE("No.",CustomerNo);
      IF cust.FINDFIRST THEN
        mytotal:=cust.COUNT;
        IF mytotal >0 THEN
        BEGIN
          rer.GETTABLE(cust);
          recordlink.SETCURRENTKEY("Record ID");
          recordlink.SETRANGE("Record ID",rer.RECORDID);
          totalrec:=recordlink.COUNT;
         recXML.SETTABLEVIEW(recordlink);
        END;
    END;


Solange die Kundennummer existiert ist ja alles in Ordnung. Wenn die Kundennummer nicht existiert, bekomme ich alle Datensätze der Tabelle recordlink übermittelt. Ist für mich auch logisch, da der xmlport alle Daten dann ungefiltert ausgibt. Aber wie verhindert man das? Diese Menge als Daten in einem Webservice macht ja gar keine Sinn.

Volker
Zuletzt geändert von vsnase am 30. Januar 2013 14:55, insgesamt 1-mal geändert.

Re: Webservice und XMLPort II

30. Januar 2013 13:36

wie wäre es, wenn du einfach prüfst, ob die Kundennummer nicht leer ist?
Code:
IF CustmerNo <> '' THEN
  ...
else
  nix;

Re: Webservice und XMLPort II

30. Januar 2013 14:22

Reicht nicht, da die eingegebene Kundennummer auch falsch sein kann.

Re: Webservice und XMLPort II

30. Januar 2013 14:55

Ich habe das jetzt so gelöst:

Code:
PROCEDURE CustGetRecordLinks@1000000000(CustomerNo@1000000002 : Code[20];VAR recXML@1000000000 : XMLport 50001;VAR totalrec@1000000001 : Integer;VAR mytotal@1000000003 : Integer);
    BEGIN
      cust.SETRANGE("No.",CustomerNo);
      IF cust.FINDFIRST THEN
        mytotal:=cust.COUNT;
        IF mytotal >0 THEN
        BEGIN
          rer.GETTABLE(cust);
          recordlink.SETCURRENTKEY("Record ID");
          recordlink.SETRANGE("Record ID",rer.RECORDID);
          totalrec:=recordlink.COUNT;
         recXML.SETTABLEVIEW(recordlink);
        END
      ELSE
        BEGIN
          recordlink.SETRANGE("Link ID", -1);
          recXML.SETTABLEVIEW(recordlink);
        END;
    END;


aber elegant ist irgendwie anders.

Volker

Re: [fast gelöst] Webservice und XMLPort II

30. Januar 2013 16:14

Du hast da ein Fehler im Code, oder ist die Einrückung inkorrekt?


Code:
PROCEDURE CustGetRecordLinks@1000000000(CustomerNo@1000000002 : Code[20];VAR recXML@1000000000 : XMLport 50001;VAR totalrec@1000000001 : Integer;VAR mytotal@1000000003 : Integer);
    BEGIN
      cust.SETRANGE("No.",CustomerNo);
      IF cust.FINDFIRST THEN
        mytotal:=cust.COUNT; //<< Einrückung
      IF mytotal >0 THEN
        BEGIN
          rer.GETTABLE(cust);
          recordlink.SETCURRENTKEY("Record ID");
          recordlink.SETRANGE("Record ID",rer.RECORDID);
          totalrec:=recordlink.COUNT;
         recXML.SETTABLEVIEW(recordlink);
        END;
    END;


Wenn es nur Einrückung wäre, dann reicht auch

Code:
PROCEDURE CustGetRecordLinks@1000000000(CustomerNo@1000000002 : Code[20];VAR recXML@1000000000 : XMLport 50001;VAR totalrec@1000000001 : Integer;VAR mytotal@1000000003 : Integer);
    BEGIN
      If cust.get(CustomerNo) THEN
        BEGIN
          mytotal += 1;  // bzw := 1. Wobei ich den Sinn davon nicht verstehe
          rer.GETTABLE(cust);
          recordlink.SETCURRENTKEY("Record ID");
          recordlink.SETRANGE("Record ID",rer.RECORDID);
          totalrec:=recordlink.COUNT;
          recXML.SETTABLEVIEW(recordlink);
        END;
    END;


Alternativ könntest Du für Deine Lösung im else-zweig eine ungefüllte Temp-Variable benutzen. Das dürfte ein Filtern auf den Echt-Daten ersparen.

Re: [fast gelöst] Webservice und XMLPort II

30. Januar 2013 16:37

Hi Jan,

bei Deinem Code ist es nun aber doch so, dass der Webservice den XMLPort normal ausführen würde, wenn keine gültige (vorhanden) Kundennummer eingegeben wird. Die Folge ist, dass der Webservice die komplette Tabelle als Antwort über die Leitung bummelt.

Code:
PROCEDURE CustGetRecordLinks@1000000000(VAR recXML@1000000000 : XMLport 50001);
    BEGIN
    END;


das reicht ja aus, dass die gesamte Tabelle per Webservice via xmlport veröffetlicht ist. Wenn ich als die Datenmenge, die der xmlport ausgibt nicht einschränke, dann wird alles übertragen. Genau das passiert bei Deinem Vorschlag wenn die Kundennummer nicht existiert.

Das mytotal in meinem Fall nur 0 oder 1 sein kann ist auch klar, ermöglicht aber dem Webservice-Konsumenten zu prüfen, ob denn der Kunde überhaupt existiert. totalrec ist ebenfalls sehr wichtig, da bei Export der Tabelle Record Link immer mindestens ein Zeile exportiert wird, auch wenn es keinen Datensatz gibt. Die Felder Link ID und Type sind in dem Fall mit 0 bzw Verknüpfung belegt, alle anderen Felder sind leer. Wenn man nun in VS mit diesem Ergebnis weiterarbeiten will sollte man wissen ob es sich bei der einen Zeile als Ergebnis um eine leere Zeile handelt oder tatsächlich um eine Datenzeile - bei totalrec > 0 sind es Daten ansonsten nur Leichen.

Volker

Re: [fast gelöst] Webservice und XMLPort II

30. Januar 2013 16:43

Wie komplex sieht denn der xmlport aus?

Alternativ (ich kenne ja nicht die Anforderung) könnte man auch eine Page für Record Links bauen, diese publishen und im VS das Set selbst filtern.

Re: [fast gelöst] Webservice und XMLPort II

30. Januar 2013 17:06

Hi Jan,

es funktioniert ja, nur man muss halt wirklich sicherstellen, dass im Falle eines Fehlers (z. B. falsche Kundennummer) auch wirklich (fast) nichts zurückgeliefert wird. Ich habe bei meinen ersten Versuchen nicht schlecht geschaut, als statt 0 Datensätzen plötzlich 1000 (=alle) da standen. Wenn dass dann bei einem Smartphone unterwegs passiert will ich nicht im Büro sein, wenn die Anwender anrufen.

Komplex ist das nicht zum Kunden/Auftrag/Artikel ... werden die Links abgerufen und neue bei Bedarf hinzugefügt. Dien neuen dazu gehen nicht über den XMLPort, sondern eine eigene Funktion.

Volker

Re: [fast gelöst] Webservice und XMLPort II

31. Januar 2013 10:54

vsnase hat geschrieben:Hi Jan,

es funktioniert ja, nur man muss halt wirklich sicherstellen, dass im Falle eines Fehlers (z. B. falsche Kundennummer) auch wirklich (fast) nichts zurückgeliefert wird. Ich habe bei meinen ersten Versuchen nicht schlecht geschaut, als statt 0 Datensätzen plötzlich 1000 (=alle) da standen. Wenn dass dann bei einem Smartphone unterwegs passiert will ich nicht im Büro sein, wenn die Anwender anrufen.

Komplex ist das nicht zum Kunden/Auftrag/Artikel ... werden die Links abgerufen und neue bei Bedarf hinzugefügt. Dien neuen dazu gehen nicht über den XMLPort, sondern eine eigene Funktion.

Volker


Publiziere Customer Page und Record Link Page (selbst erstellt) und du solltest im VS alles das tun, was du benötigst. Dann sollte auch deine Krücke bzgl. "ich bekomme Daten angezeigt, überprüfe aber über integer obs überhaupt Daten sind" weg.

Re: [fast gelöst] Webservice und XMLPort II

31. Januar 2013 11:12

Und was übergebe ich dann als Filter für Record ID der Tabelle Record Link? den Key von Cutsomer?

Volker

Re: [fast gelöst] Webservice und XMLPort II

31. Januar 2013 11:57

http://msdn.microsoft.com/en-us/library/dd355316.aspx

Im C# Code siehst Du

Code:
List<Customer_Filter> filterArray = new List<Customer_Filter>();
            Customer_Filter nameFilter = new Customer_Filter();
            nameFilter.Field = Customer_Fields.Name;
            nameFilter.Criteria = "C*";
            filterArray.Add(nameFilter);


So wählt man das Feld aus auf dem gefiltert wird.
Beim Customer Webservice (bei dir jetzt vor Record Link) kannst du auch die "Record ID" bekommen ("Customer: 10000"). Damit kannst Du dann im RecordLink ohne weiteres genau nach Deinen Wünschen filtern.

Re: [fast gelöst] Webservice und XMLPort II

31. Januar 2013 12:10

Hi Jan,

ich nochmal.

Das heißt aber ich muss für meinen Filter auf "Record Link" den Filter zusammensetzen:
Code:
 nameFilter.Criteria = "Customer: " & CustomerNo


oder kann ich RecordLinkWS.Record_ID = cust.key übergeben?

Volker

Re: [fast gelöst] Webservice und XMLPort II

31. Januar 2013 12:57

vsnase hat geschrieben:Hi Jan,

ich nochmal.

Das heißt aber ich muss für meinen Filter auf "Record Link" den Filter zusammensetzen:
Code:
 nameFilter.Criteria = "Customer: " & CustomerNo


oder kann ich RecordLinkWS.Record_ID = cust.key übergeben?

Volker


Filter brauchst Du nicht zusammensetzen.
Die Member der Webservices und deren Attribute kenne ich nicht auswendig. Ich weiß aber das es sie gibt.