Query Beispiele

In diesem Teil der Dokumentation finden Sie einige praxisbezogene Anwendungsbeispiele von Query-Abfragen.

Beispiel 1

Suchen von allen Dokumentpositionen (Verkauf) der Dokumentstufe RE mit Shortcut N ab dem 01.07.2013.
Es wird pro Kunde die Summe von SalDocItem.TotalAmount pro Ertrags-Konto und Artikel gebildet.
Query
Main=SalDoc
Column=KundenNo,SalDoc.CustNo
Column=ErtragsKonto,SalItems.ReturnsAccount
Column=ArtNo,SalItems.ArtNo
Column=TotalAmount,sum(SalItems.TotalAmount)
Related=SalItems,SalDocItem,All,,SalDoc.InternalNo = SalItems.SalDocInternalNo
Filter=SalDoc.SalProcLevelCd = 4 and SalDoc.ShortCut = 'N' and SalDoc.DocDate >= 01.07.2013 and SalItems.ArtNo <> ''
OrderBy=SalDoc.CustNo    
OrderBy=SalItems.ReturnsAccount
MaxRows=All

Beispiel 2

Suchen von allen MLS-Texten (in allen Sprachen) bei welchen der Schlüssel (MlsText.MlsKey) mit dem String "Addr." beginnt.
Query
Main=MlsText
Column=Key,MlsText.MlsKey
Column=Name,if(ContextInfo.DataLangNo = NativeLang.German,MlsText.NameGe,if(ContextInfo.DataLangNo = NativeLang.French,MlsText.NameFr,if(ContextInfo.DataLangNo = NativeLang.Italian,MlsText.NameIt,if(ContextInfo.DataLangNo = NativeLang.English,MlsText.NameEn,MlsText.NameGe))))
Column=ShortName,if(ContextInfo.DataLangNo = NativeLang.German,MlsText.ShortNameGe,if(ContextInfo.DataLangNo = NativeLang.French,MlsText.ShortNameFr,if(ContextInfo.DataLangNo = NativeLang.Italian,MlsText.ShortNameIt,if(ContextInfo.DataLangNo = NativeLang.English,MlsText.ShortNameEn,MlsText.ShortNameGe))))
Column=Info,if(ContextInfo.DataLangNo = NativeLang.German,MlsText.InfoGe,if(ContextInfo.DataLangNo = NativeLang.French,MlsText.InfoFr,if(ContextInfo.DataLangNo = NativeLang.Italian,MlsText.InfoIt,if(ContextInfo.DataLangNo = NativeLang.English,MlsText.InfoEn,MlsText.InfoGe))))
Filter=Key like 'Addr.*'
MaxRows=All

Beispiel 3

Ausgehend von einer Adresse werden alle Objekte dieser Adresse abgefragt. Falls die gefundenen Objekte mit Verkaufspositionen derselben Adresse verknüpft sind, werden Attribute von SalDoc und SalDocItem ausgegeben.
Ausgehend von den gefundenen Objekten werden Adress-Attribute des Mitarbeiters (ObjItem.Modifier) und des Kunden (ObjItem.AddrNo) ausgegeben.
Query
Main=ObjItem
Columns=ObjItem.Number,ObjItem.ObjTypeNo,ObjItem.ObjStructTypeNo,ObjItem.AddrNo,ObjItem.ArtNo,ObjItem.Quantity
Columns=SalItem.BoId,Customer.FullName,Customer.Zip,Customer.City
Columns=ObjItem.Modifier,Employee.LastName
Related=Employee,Addr,1,,Employee.Number = ObjItem.Modifier
Related=Customer,Addr,1,,Customer.Number = ObjItem.AddrNo
Related=SalDocument,SalDoc,1,,SalDocument.InternalNo= ObjItem.DocInternalNo
Related=SalItem,SalDocItem,1,,SalItem.InternalNo = ObjItem.DocItemNumber and SalItem.SalDocInternalNo = ObjItem.DocInternalNo
OrderBy=ObjItem.DocInternalNo
OrderBy=ObjItem.DocItemNumber
Filter=ObjItem.AddrNo=2002
MaxRows=All

Beispiel 4

Auslesen von sprachabhängigen Attributen über eine entsprechende Funktions-View.
Hier im Beispiel ist der Name der Funktions-View: Art_Name1. Diese liefert die Artikelbezeichnung 1 gem. Sprachnummer im Argument der Funktions-View.
Die Funktions-View verfügt über folgende drei Argumente:
  • Interne Artikelnummer
  • Sprachnummer
  • Qualifikator 0/1 (0=Schwacher Qualifikator, 1=Starker Qualifikator)
Query
Main=Art
Columns=Art.Number,Art.Name1,ArtName1Sprache2.Name1,ArtName1Sprache3.Name1,ArtName1Sprache4.Name1
Related=ArtName1Sprache2,Art_Name1(Art.InternalNo,2,0)
Related=ArtName1Sprache3,Art_Name1(Art.InternalNo,3,0)
Related=ArtName1Sprache4,Art_Name1(Art.InternalNo,4,0)
Filter=Art.InternalNo=3407
MaxRows=All

Beispiel 5

Folge-Request (Redo)
/headerreport
# Definition Anzahl Datensätze pro Durchlauf.
«X(Query.ScrollingCount=10)»
# Anzahl Wiederholungen  (1x normal plus 3x redo)
«X(Query.RedoRepeat=3)»
# Definition Basis Request.
«XQRY(req.QueryAddr:Query)»
«XQRY(req.QueryAddr:addArg=Main=Addr)»
«XQRY(req.QueryAddr:addArg=Columns=Addr.Number,Addr.FirstName,Addr.LastName)»
«XQRY(req.QueryAddr:addArg=MaxRows=«X(Query.ScrollingCount)»)»
«XQRY(req.QueryAddr:addArg=Scrolling=ne)»
«XQRY(req.QueryAddr:addArg=OrderBy=Addr.Number)»
«XQRY(req.QueryAddr:addArg=OrderBy=Addr.BoPid)»
«nXQRY(req.QueryAddr:execute>res.QueryAddr)\A»
«nNO(9,NULL)»
«REPEAT(9)»
«nNO(9)»
# Variablen zwischenspeichern.
«X(Addr.Number    =«XQRS(res.QueryAddr:Addr.Number,«NO(9,0)»)»)»
«X(Addr.BoPid     =«XQRS(res.QueryAddr:Addr.BoPid,«NO(9,0)»)»)»
«X(Addr.FirstName =«XQRS(res.QueryAddr:Addr.FirstName,«NO(9,0)»)»)»
«X(Addr.LastName  =«XQRS(res.QueryAddr:Addr.LastName,«NO(9,0)»)»)»
# Ausgabe der (aktuellen) Response.
«/Response.PrintResult»
«nzNO(9,0)<«XQRS(res.QueryAddr:rows)\N»\N»«LOOP(9)»
# Ausführung des Redo's gem. «X(Query.RedoRepeat)»
«nzX(Query.RedoRepeat)=0\N»«GOTO(/)»
«nNO(8,NULL)»
«REPEAT(8)»
«nNO(8)»
«/Response.RedoData»
«nzNO(8,0)<«X(Query.RedoRepeat)\N»\N»«LOOP(8)»
/

/Response.RedoData
«nXQRS(res.QueryAddr:redo,n,,)»
«nNO(9,NULL)»
«REPEAT(9)»
«nNO(9)»
# Variablen zwischenspeichern.
«X(Addr.Number    =«XQRS(res.QueryAddr:Addr.Number,«NO(9,0)»)»)»
«X(Addr.BoPid     =«XQRS(res.QueryAddr:Addr.BoPid,«NO(9,0)»)»)»
«X(Addr.FirstName =«XQRS(res.QueryAddr:Addr.FirstName,«NO(9,0)»)»)»
«X(Addr.LastName  =«XQRS(res.QueryAddr:Addr.LastName,«NO(9,0)»)»)»
# Ausgabe der (aktuellen) Response.
«/Response.PrintResult»
# Wenn Counter NO(9) = Anzahl Records,
# --> QueryToken speichern und Redo-Argumente definieren.
«nzNO(9,0)<«XQRS(res.QueryAddr:rows)\N»\N»«LOOP(9)»
/

/Response.PrintResult
# Ausgabe der Rows.
«X(Addr.Number)»/«X(Addr.BoPid)»/«X(Addr.FirstName)»/«X(Addr.LastName)»
/

Beispiel 6

Im Sinne einer Rekapitulation werden die Positionsbeträge eines Verkaufsdokuments nach Artikelgruppe summiert. Die Ausgabe der Summe pro Artikelgruppe erfolgt in der Spalte Rekap.
Query
Main=SalDocItem
Column=ArtGr,SalDocItem.ArtMisC1No
Column=Rekap,sum(SalDocItem.TotalAmount)
Column=Bez,GrBez.Name
Column=Doc,SalDocItem.SalDocInternalNo
Related=GrBez,ArtMisC1,1,,GrBez.Number = SalDocItem.ArtMisC1No
OrderBy=ArtGr
Filter=SalDocItem.SalDocInternalNo=11930
MaxRows=All

Beispiel 7

Es sollen alle Adressen eines Pools (hier im Beispiel der Adresspool Nr. 999998) gelesen werden, welche entweder:
a) Keine Tasks und keine ResourcenKalender Einträge aufweisen.
b) Tasks aber keine ResourcenKalender Einträge aufweisen.
c) Tasks und ResourcenKalender Einträge aufweisen.
d) Keine Tasks aber ResorucenKalender Einträge aufweisen.
Das Resultat soll nach AdressNummer und "StartDate" sortiert werden.
Query
Main=AddrPoolItem
Column=ResBoId,AddrPoolItem.AddrNo
Column=StartDate,if(exists(TaskStart)= TRUE,TaskStart.Day,ResCal.Day)
Column=EndDate,if(exists(TaskEnd) = TRUE,TaskEnd.Day,ResCal.Day)
Column=RGB,if(exists(TaskStart) = TRUE,Tasks.DocTypeCd,ResCal.ResCalCauseNo)
Column=Info,if(exists(TaskStart) = FALSE,nmbToStr(ResCal.ResCalCauseNo),"")
Column=AsstDocItemBoId,if(exists(TaskStart) = TRUE,if(Tasks.DocTypeCd=3,""+nmbToStr(Tasks.DocInternalNo)+","+nmbToStr(Tasks.DocItemInternalNo),""),"")
Column=Type,if(exists(TaskStart) = TRUE,"TASK",if(exists(ResCause)=TRUE,"RESOURCE",""))
Related=ResCal,ResCalendar,ALL,,AddrPoolItem.AddrNo = ResCal.ResourceNo and ResCal.ResDayTypeCd = 2 and ResCal.Day >= 01.12.2013 and ResCal.Day <=31.12.2013
Related=ResCause,ResCalCause,,,ResCause.Number = ResCal.ResCalCauseNo
Related=Tasks,Task,ALL,,AddrPoolItem.AddrNo = Tasks.ResourceNo
Related=TaskStart,TaskDay,,,Tasks.Number=TaskStart.TaskNo and TaskStart.Day >= 01.12.2013
Related=TaskEnd,TaskDay,,,Tasks.Number=TaskStart.TaskNo and TaskEnd.Day <= 31.12.2013
Filter=AddrPoolItem.AddrPoolNo=999998
Distinct=1
OrderBy=ResBoId
OrderBy=StartDate
MaxRows=All

Beispiel 8

Alle Adressen welche in den letzten 20 Tagen mutiert wurden.
Query
Main=Addr
Columns=Addr.Number,Addr.FullName
Column=MutationsDatum,Addr.Modified
Column=AktuellesDatum,today()
Column=AktuelleZeit,time()
Filter=Addr.Modified >= dateAdd(today(),-20)
MaxRows=All

Beispiel 9

Differenz von Datumswerten ermitteln. (Tag, Monat und Jahr.)
Query
Main=DatePart
Column=StartDate,strToDate("01.12.2014")
Column=EndDate,strToDate("01.12.2015")
Column=DifferenceInDays,dateDiff(01.12.2014,01.12.2015,DatePart.Day)
Column=DifferenceInMonth,dateDiff(01.12.2014,01.12.2015,DatePart.Month)
Column=DifferenceInYears,dateDiff(01.12.2014,01.12.2015,DatePart.Year)
MaxRows=1

Beispiel 10

Redefinition (Bezeichner) von kontextabhängigen Daten auslesen.
Hier im Beispiel wird für ein bestimmtes Dokument die redefinierte Bezeichnung des Attributs SalDoc.Free3 im Kontext der RE/X ausgelesen.
Query
Main=SalDoc
Filter=SalDoc.InternalNo = 123456
Columns=SalDoc.InternalNo,SalDoc.SalProcLevelCd,SalDoc.ShortCut
Column=Lieferart, name(SalDoc.Free3,["4,A"],NativeLang.German)
MaxRows=All
Wichtig
Wichtig
Das Auslesen von Bezeichnungen von Codes aus freien Hilfstabellen funktioniert über name(... nicht. In diesen Fällen müssen Sie mit einer Relation arbeiten.

Beispiel 11

Auslesen aller Kontaktpersonen ab höchster Mutter über die "Hierarchie". Wobei die "Levels" nicht berücksichtigt werden können, ausser über eine separate Auswertung des Resultats der Query-Abfrage.
Query
Main=Addr
MaxRows=All
Columns=Contact.AddrNo,Contact.Number,Contact.LastName,Addr.IsNextParentCo
Filter=Addr.HighParentCompany=1070 or Addr.Number=1070
Related=Contact,Contact,All,,Contact.AddrNo = [Addr.Number]
Related=Daughter,Addr,All,,Daughter.NextParentCompany = Contact.AddrNo
Columns=Addr.NextParentCompany,Daughter.Number

Beispiel 12

Auslesen eines Textblocks einer Adresse. (Hier im Beispiel: Adresse = 2020, Textblock Nr. = 1)
Query
Main=AddrText(2020,1)
MaxRows=All
Columns=AddrText.Text

Beispiel 13

Auslesen der Adress-Pool-Hierarchie (Pfad) ausgehend von einem Adress-Pool.
Bekannt sind, aufgrund des Adress-Pools welcher den Ausgangspunkt bildet: Die Pool-Gruppe in welcher sich der Adress-Pool befindet (5) sowie die eigene Pool-Nr (600)
Query
Main=Hierarchie,AddrPoolFolder_Path(5,0,600)
Column=FolderNo,Hierarchie.FolderNo
Column=Name,FolderName.Name
Related=FolderName,AddrPoolFolder,1,,FolderName.Number=Hierarchie.FolderNo
OrderBy=-Hierarchie.Level
MaxRows=99
Resultat:
FolderNo Name
7
Root
2
Laufende Projekte
5
Vorstudie
Darstellung der obigen Hierarchie in BC 12011:
BC_12011.jpg

Beispiel 14

Auslesen aller Sonderzusätze eines bestimmten Kunden. Pro Sonderzusatz wird die externe Artikelnummer ausgegeben.
Query
Main=CustArtCond
MaxRows=All
Filter=CustArtCond.CustBoType=1 and CustArtCond.CustBoId=1085 and CustArtCond.ArtBoType=1
Column=,CustArtCond.ArtBoId
Related=Sortiment,SalCondAdd,First,[-Sortiment.ValidFrom],Sortiment.SuperNo=CustArtCond.NormalAddSuperNo and ((if(Sortiment.ValidFrom=EMPTY_DATE,01.01.1900,Sortiment.ValidFrom) <= today()) and (if(Sortiment.ValidTo=EMPTY_DATE,31.12.2100,Sortiment.ValidTo) >= today()))
Column=Kundensortiment,Sortiment.ExtArtNo
Sollen nur Sonderzusätze angezeigt werden bei denen eine externe Artikelnummer hinterlegt ist, kann der Filter ergänzt werden.
Filter=CustArtCond.CustBoType=1 and CustArtCond.CustBoId=1085 and CustArtCond.ArtBoType=1 and Sortiment.ExtArtNo<>""

Beispiel 15

Auslesen der Anzahl Positionen eines Verkaufsdokuments. (Set-Zeilen werden inkl. Set-Kopf ebenfalls als Position gerechnet.)
Query
Main=SalDocItem
Column=Anzahl_Pos,count()
Filter=SalDocItem.SalDocInternalNo=10760 and SalDocItem.ItemNo>0
MaxRows=1

Beispiel 16

Auslesen von Artikelpool-Einträgen. (Weiteres Beispiel für redo)
/headerreport
# ______________________________________________________________________________________________
# Query Reqeust aufbauen und ausführen
«XQRY(reqGetPoolItems:clear)»
«XQRY(reqGetPoolItems:addArg =Main=ArtPoolItem)»
«XQRY(reqGetPoolItems:addArg =MaxRows=1000)»
«XQRY(reqGetPoolItems:addArg =Filter=ArtPoolItem.ArtPoolNo=[1000,2000,3000])»
# 
# Scrolling definieren für 'Redo'
«XQRY(reqGetPoolItems:addArg =Scrolling=ne)»
«XQRY(reqGetPoolItems:addArg =Columns=Art.InternalNo,Art.Keyword3)»
«XQRY(reqGetPoolItems:addArg =OrderBy=Art.Keyword3)»
# 
# OrderBy mit <BOTyp>.BoPid ergänzen, damit die Records eindeutig werden. (Für 'Redo')
«XQRY(reqGetPoolItems:addArg =OrderBy=ArtPoolItem.BoPid)»
«nXQRY(reqGetPoolItems:execute>resPoolItems)\A»
# 
# Wenn keine Daten gefunden Verarbeitung abbrechen
«nz XQRS(resPoolItems:rows)=0\N»«GOTO(/)»
# Anzahl Datensätze speichern
«X(Response.RowCount=«XQRS(resPoolItems:rows)»)»
# ______________________________________________________________________________________________
# INFO: Dieser REPEAT / LOOP wird für REDO benötigt (Wiederholungen)
«REPEAT(1)»
# **********************************************************************************************
# REPEAT / LOOP Für die Ausgabe des aktuellen Results
«nNO(9,NULL)»
«REPEAT(9)»
«nNO(9)»
# **********************************************************************************************
# Ausgabe der gewünschten Daten
«XQRS(resPoolItems:Art.InternalNo,«NO(9,0)»)»
«XQRS(resPoolItems:Art.Keyword3,«NO(9,0)»)»
# 
«nz NO(9,0)<«X(Response.RowCount)\N»\N»«LOOP(9)»
# 
# ______________________________________________________________________________________________
# REDO ausführen (nächste 1000 Datensätze)
# WICHTIG: hier nun 'n' damit der letzte Datensatz des vorangegangenen Request nicht mehr erscheint.
«nXQRS(resPoolItems:redo,n,,1000)»
«X(Response.RowCount=«XQRS(resPoolItems:rows)»)»
# ______________________________________________________________________________________________
# Wiederholen bis RowCount = 0 (keine weiteren Daten)
«nz X(Response.RowCount)>0\N»«LOOP(1)»
/

Beispiel 17

Anwendung der Konversionen strAsNmb und strAsDate.
Biz.Query 
Main=Addr 
Columns=Addr.Free6 
MaxRows=100 
Column=AddrFree6AsNmb,ifnull(strAsNmb(Addr.Free6), -1) 
Column=AddrFree6AsDate,ifnull(strAsDate(Addr.Free6), EMPTY_DATE)