XML erstellen mit unknown = true

Rambo21

Aktiver Benutzer
Beiträge
37
Hallo Leute,
ich arbeite nun an einem Projekt, wo ich am Ende eine XML Datei aus einer Abfrage erstellen muss. Die XML Datei habe ich eigentlich schon, nur bin ich nun an einem Punkt angelangt wo ich nicht mehr weiter weiß.
Ich habe eine Kundendatenbank, wo leider nicht immer alle Daten vollständig hinterlegt sind, wie zB. das Geburtsdatum, die Straße. etc.. . Ist das der Fall, müssen Ersatzdaten gesendet werden mit unknown="true". Wenn ich nun kein Geburtsdatum habe, muss ich als Ersatzdatum 1901-01-01 senden und im Birthdate das unknown="true" mitsenden. Und das gilt auch für Street, BuildingIdentifier, PostCode, City und CountryCode.

<SurName>Muster</SurName>
<GivenName>Maria</GivenName>
<BirthDate unknown="true">1901-01-01</BirthDate>
-<Address>
<Street unknown="true">unbekannt</Street>
<BuildingIdentifier unknown="true">0</BuildingIdentifier>
<FloorIdentifier></FloorIdentifier>
<SuiteIdentifier></SuiteIdentifier>
<PostCode unknown="true">1111</PostCode>
<City unknown="true">unbekannt</City>
<CountryCode unknown="true">AT</CountryCode>

GebDat verfügbar: <BirthDate>1955-08-30</BirthDate>
GebDat nicht verfügbar: <BirthDate unknown="true">1901-01-01</BirthDate>

Zur Info: Wenn ich keine Daten habe, ist in der Tabelle NULL hinterlegt.
Wie kann ich das anstellen?

Danke für eure Unterstützung!
 
Werbung:
Code:
WITH xmlnamespaces ('https://finanzonline.bmf.gv.at/fon/ws/uebermittlungKonto' as xy, 'at:gv:bmf:fon:isocountrytypes:v1' as iso, 'http://www.w3.org/2001/XMLSchema-instance' as xsi)
SELECT '123456789'            AS [Info_Daten/Fastnr_fon_Tn] ,
       '123456789'            AS [Info_Daten/Fastnr_Fi],
       t2.Vers                    AS [Info_Daten/Vers],
       'Bank AG' AS [MessageSpec/SendingCompany],
       t2.MessageRefId            AS [MessageSpec/MessageRefId],
       'BICBICBIC'            AS [MessageSpec/Bic],
       t2.TIMESTAMPS            AS [MessageSpec/Timestamp],
        (
        SELECT t3.DOCTYPEINDIC as [DocSpec/DocTypeIndic],
               t3.DocRefId as [DocSpec/DocRefId],
               --t3.CORRDOCREFID as [DocSpec/CorrDocRefId],
               'IBAN' AS 'AccountNumber/@AcctNumberType',
               t3.ACCOUNTNUMBER AS 'AccountNumber',
               t3.ACCOUNTTYPE AS 'AccountType',
               t3.ACCOUNTSTART AS 'AccountStart',
               --t3.ACCOUNTEND AS 'AccountEnd',
               t3.VALUE                 AS [AccountHolder/Organisation/Identification/Value],
               t3.TYPE                    AS [AccountHolder/Organisation/Identification/Type], 
               CASE WHEN t3.VALUE IS NULL or t3.VALUE = '' THEN t3.NAME ELSE NULL END                    AS [AccountHolder/Organisation/Name],
               CASE WHEN t3.VALUE IS NULL or t3.VALUE = '' THEN t3.STREET ELSE NULL END                AS [AccountHolder/Organisation/Address/Street],
               CASE WHEN t3.VALUE IS NULL or t3.VALUE = '' THEN t3.BUILDINGIDENTIFIER ELSE NULL END    AS [AccountHolder/Organisation/Address/BuildingIdentifier],
               CASE WHEN t3.VALUE IS NULL or t3.VALUE = '' THEN t3.FLOORIDENTIFIER ELSE NULL END        AS [AccountHolder/Organisation/Address/FloorIdentifier],
               CASE WHEN t3.VALUE IS NULL or t3.VALUE = '' THEN t3.SUITEIDENTIFIER ELSE NULL END        AS [AccountHolder/Organisation/Address/SuiteIdentifier],
               CASE WHEN t3.VALUE IS NULL or t3.VALUE = '' THEN t3.POSTCODE ELSE NULL END                AS [AccountHolder/Organisation/Address/PostCode],
               CASE WHEN t3.VALUE IS NULL or t3.VALUE = '' THEN t3.CITY ELSE NULL END                    AS [AccountHolder/Organisation/Address/City],
               CASE WHEN t3.VALUE IS NULL or t3.VALUE = '' THEN t3.COUNTRYCODE ELSE NULL END            AS [AccountHolder/Organisation/Address/CountryCode],
               t3.ACCOUNTSTART            AS [AccountHolder/Start]

        FROM [Kontenregister].[dbo].[ACCDATA] as t3
        WHERE t3.DOCTYPEINDIC = 'E'
          AND t3.MESSAGEREFID = (select MAX(MESSAGEREFID) from ACCDATA)
        GROUP BY t3.DOCTYPEINDIC, t3.DocRefId, t3.CORRDOCREFID, t3.ACCOUNTNUMBER, t3.ACCOUNTTYPE, t3.ACCOUNTSTART, t3.ACCOUNTEND, t3.VALUE, t3.TYPE, t3.NAME,
                 t3.STREET, t3.BUILDINGIDENTIFIER, t3.FLOORIDENTIFIER, t3.SUITEIDENTIFIER, t3.POSTCODE, t3.CITY, t3.COUNTRYCODE
        for xml path('AccountReport'), Root('KontoregisterBody'), elements, type
        )
FROM [Kontenregister].[dbo].[ACCDATA] as t2
WHERE t2.MESSAGEREFID = (select MAX(MESSAGEREFID) from ACCDATA)
GROUP BY t2.VERS, t2.MESSAGEREFID, t2.TIMESTAMPS
for xml path('Kontoregister'), elements, type
 
Ich hab hier mal einen Test gebastelt:
Code:
WITH t(test) AS (
   SELECT   NULL
   UNION ALL
   SELECT   1
   )
SELECT   (CASE WHEN t.test IS NULL THEN 'true' ELSE NULL END) AS [Spalte/@unknown],
     t.test AS Spalte
FROM   t
for xml path('AccountReport'), Root('KontoregisterBody'), elements, type
Das hier hab ich noch als Quelle genommen:
convert sql table to xml name value pair
NULL-Werte scheinen ja von XML erstmal ignoriert zu werden, man könnte also für jede Spalte eine weitere "Spalte" mit CASE erstellen die, wenn die eigentliche Spalte NULL ist, das unknown-true als name-value Paar setzt. Ich habe aber noch nicht viel XML Erfahrung, vielleicht geht es auch eleganter.
 
Hallo Ukulele,
das sieht schon gut aus, aber ich brauche ja noch den Wert "unbekannt". Dieser fehlt im Ergebnis.
So muss es ausschauen.

Code:
<KontoregisterBody>
  <AccountReport>
    <Spalte unknown="true">unbekannt</Spalte>
  </AccountReport>
  <AccountReport>
    <Spalte>1</Spalte>
  </AccountReport>
</KontoregisterBody>

Danke
 
Zuletzt bearbeitet:
Läßt sich mit einer Spalte ohne Spaltentitel machen, ob das richtig ist kann ich aber nicht sagen ;)
Code:
WITH t(test) AS (
   SELECT   NULL
   UNION ALL
   SELECT   1
   )
SELECT   (CASE WHEN t.test IS NULL THEN 'true' ELSE NULL END) AS [Spalte/@unknown],
     (CASE WHEN t.test IS NULL THEN 'unknown' ELSE NULL END),
     t.test AS Spalte
FROM   t
for xml path('AccountReport'), Root('KontoregisterBody'), elements, type
 
Werbung:
Hallo,
Es funktioniert doch mit deiner ersten Abfrage, k.A. was schief ging. Ich habe nun mit echten Daten und der Tabelle probiert und es hat funktioniert.
Code:
SELECT CASE WHEN t.STREET = 'nicht vorhanden' THEN 'true' END AS [Street/@unknown]
     , t.STREET AS Street
FROM  CTRLGPERSON AS t
for xml path('AccountReport'), Root('KontoregisterBody'), elements, type

Code:
  <AccountReport>
    <Street>A. SMETONOS STR. 6-1</Street>
  </AccountReport>
  <AccountReport>
    <Street unknown="true">nicht vorhanden</Street>
  </AccountReport>

Vielen Dank für die Unterstützung!
 
Zurück
Oben