[gelöst] Report Design Expressions GET DATA

5. August 2018 17:30

Hallo Liebe Community,

ich habe bereits mehrere Jahre erfolgreich im Classic Client mit NAV 5 programmiert und entwickelt.

Jetzt soll ich einen Report in NAV 16 erstellen.
Ich soll einen individuellen Einkaufs-Retourenlieferschein grafisch ähnlich dem VK-Lieferschein einbauen.

Hierbei komme ich jedoch mit den GetData Expressions nicht zurecht.
Wo ist definiert welche Werte dort drin stehen etc....
Kann mir jemand hilfreiche Tipps und Seiten empfehlen wie man sich dort am besten einarbeiten kann?

Vielen Dank im Voraus.
Zuletzt geändert von simon.sprenger am 7. August 2018 08:18, insgesamt 1-mal geändert.

Re: Report Design Expressions GET DATA

6. August 2018 07:43

Herzlich Willkommen bei uns!

simon.sprenger hat geschrieben:ich habe bereits mehrere Jahre erfolgreich im Classic Client mit NAV 5 programmiert und entwickelt.

Jetzt soll ich einen Report in NAV 16 erstellen.

Das ist eine sportliche Herausforderung, weil du komplett umdenken musst :shock:

Kann mir jemand hilfreiche Tipps und Seiten empfehlen wie man sich dort am besten einarbeiten kann?

Bei uns ;-)
viewtopic.php?f=19&t=12763

Unter "Aufgaben" findest du auch Artikel speziell zu GetData.

Re: Report Design Expressions GET DATA

6. August 2018 09:31

Hallo,

ich für meinen Teil habe GetData und SetData durch eigene Funktionen ersetzt, die meiner Meinung nach das Leben erheblich erleichtern.

Code:
Public Function GetArrayStr(ByVal What as String, ByVal Field as object) as String
  return (What & "|" & iif(isnothing(Field),"",Replace(Field.tostring,"|","<&#124>"))) & "|"
End Function

Public Function GetRealVal(ByVal Value as String) as String
 if (Value <> "") then
   return Replace(Value,"<&#124>","|")
 else
   return Value
 end if
End Function


Public Shared DataActPars As New System.Collections.Hashtable

Public Function SetDataValueArray(byval Data as object) as String
  dim StrArray() as string
  AfterTotal = false
  if isnothing(Data) or (Cstr(Data) ="") then
    return"&nbsp;"
  end if

  DataActPars.clear
  if not isnothing(Data) then
    StrArray = split(Cstr(Data),"|")
    For index as integer = 0 To StrArray.GetUpperBound(0) Step 2
      if StrArray(index)<>"" then
        DataActPars(Strarray(index)) = GetRealVal(StrArray(index+1))
       end if
    next index
  end if
  Return "&nbsp;"
End Function

Public Function GetDataValue(ByVal What as string) as Object
  if isnothing(DataActPars(What)) then
    return("*XxXxXxXxXxXxX*")
'    return(What)
  else
    return DataActPars(What)
  end if
end Function




Der Aufruf von SetData erfolgt bei mir in der Expression einem sichtbaren Feld ganz oben Links im Boddy des Reports. Das hat zumindest ab NAV2015 den Vorteil, das man GetData sowohl in Header, Footer als auch im Boddy benutzen kann.
Der Aufbau des SetData übergebenen Strings ist in der Form 'VARNAME|Wert|' also z.B. 'NameLbl|Name|Name2Lbl|Name 2|'

Da ich den String für SetData zum großen Teil schon im C/AL- Teil des Reports aufbaue (die übergebenen Werte/Texte sind in fast jedem Beleg die gleichen) sieht die Expression dieses Feldes etwa so aus:
Code:
=Code.SetData(fields!DataText.Value+
GetArrayStr("CompanyInfo__Phone_No__Caption" , Fields!CompanyInfo__Phone_No__Caption.Value) +
GetArrayStr("CompanyInfo__Phone_No__" , Fields!CompanyInfo__Phone_No__.Value) +
GetArrayStr("CompanyInfo__Fax_No__Caption" , Fields!CompanyInfo__Fax_No__Caption.Value) +
GetArrayStr("CompanyInfo__Fax_No__" , Fields!CompanyInfo__Fax_No__.Value) +
GetArrayStr("CompanyInfo__VAT_Registration_No__Caption" , Fields!CompanyInfo__VAT_Registration_No__Caption.Value) +
GetArrayStr("CompanyInfo__VAT_Registration_No__" , Fields!CompanyInfo__VAT_Registration_No__.Value) +
GetArrayStr("CompanyInfo__Giro_No__Caption" , Fields!CompanyInfo__Giro_No__Caption.Value) +
GetArrayStr("CompanyInfo__Giro_No__" , Fields!CompanyInfo__Giro_No__.Value) +
GetArrayStr("CompanyInfo__Bank_Name_Caption" , Fields!CompanyInfo__Bank_Name_Caption.Value) +
GetArrayStr("CompanyInfo__Bank_Name_" , Fields!CompanyInfo__Bank_Name_.Value) +
GetArrayStr("CompanyInfo__Bank_Account_No__Caption" , Fields!CompanyInfo__Bank_Account_No__Caption.Value) +
GetArrayStr("CompanyInfo__Bank_Account_No__" , Fields!CompanyInfo__Bank_Account_No__.Value) +
GetArrayStr("Sales_Header___Bill_to_Customer_No__Caption" , Fields!Sales_Header___Bill_to_Customer_No__Caption.Value) +
GetArrayStr("Sales_Header___Bill_to_Customer_No__" , Fields!Sales_Header___Bill_to_Customer_No__.Value) +
GetArrayStr("VATNoText" , Fields!VATNoText.Value) +
GetArrayStr("Sales_Header___VAT_Registration_No__" , Fields!Sales_Header___VAT_Registration_No__.Value) +
GetArrayStr("ReferenceText" , Fields!ReferenceText.Value) +
GetArrayStr("Sales_Header___Your_Reference_" , Fields!Sales_Header___Your_Reference_.Value) +
GetArrayStr("Sales_Header___Shipment_Date_Caption" , Fields!Sales_Header___Shipment_Date_.Value)+
GetArrayStr("Sales_Header___No__Caption" , Fields!Sales_Header___No__Caption.Value) +
GetArrayStr("Sales_Header___No__" , Fields!Sales_Header___No__.Value) +
GetArrayStr("Sales_Header___Prices_Including_VAT_Caption" , CStr(Fields!PricesInclVAT_YesNo.Value) +
GetArrayStr("SalesPersonText" , Fields!SalesPersonText.Value) +
GetArrayStr("SalesPurchPerson_Name" , Fields!SalesPurchPerson_Name.Value) +
GetArrayStr("FORMAT__Sales_Header___Document_Date__0_4_" , Fields!FORMAT__Sales_Header___Document_Date__0_4_.Value))


"DataText" ist eine Variable, die den in C/AL aufbereiteten Text in der oben beschriebenen Form enthält. Die Funktion "GetDataArrStr" ermöglicht es SetData aus dem Report zusätzliche Parameter zu übergeben. Das Ergebnis von GetDataArrStr wird einfach als zusätzlicher Text SetData angehängt.

Der Zugriff auf die Daten erfolgt mit "GetData". Der übergebene Parameter ist der VARNAME aus dem SetData übergebenen ArrayString. z.B.
Code:
=GetData("Sales_Header___No__")


Wenn man sich an die Struktur hält, dann kann man mit dem Variablennamen auf das entsprechende Textfeld zugreifen, und man muss sich nicht mit irgendwelchen Indexen oder Gruppen herumschlagen.

Das mag zwar auf den ersten Blick mehr Schreibaufwand sein. Auf den zweiten Blick (Aufbereitung des übergebenen Strings in C/AL und ein paar anderer Tricks erspart es sehr viel Arbeit)
Der größte Vorteil liegt aber darin, das man auch nach einem halben Jahr noch verstehen kann, was man da im RDLC angestellt hat. 8-)

Ein kleines Gimmick ist der Wert "*XxXxXxXxXxXxX*" der von GetData zurückgeben wird, wenn man eine Variable nicht übergeben hat. Man sieht auf den Belegen relativ schnell, ob man etwas vergessen hat. :wink:

Gruß Fiddi

Re: [gelöst] Report Design Expressions GET DATA

7. August 2018 08:19

Erst einmal vielen Dank an alle die geholfen haben.

Um auch mal etwas nützliches hier beizutragen:

Folgendes Youtube Video fand ich sehr gut und hat mir sehr geholfen.

https://www.youtube.com/watch?time_continue=3&v=dievcKyhoWU