0

csv Import mapping

Hallo zusammen,

ich habe hier ein Problem und suche ein paar Ideen dazu wie ich dies umsetzen kann.

ich habe hier eine Stammdatentabelle die aus unterschiedlichen Datenquellen Daten bezieht. Die Datenquellen sind aber immer aus anderen SAP Systemen oder anderen Systemen unserer Betriebsführungen. Die Feldnamen dort haben hier aber andere Bezeichnungen. Ich habe x Anzahl von csv Importdateien die ich in die Zieldatei bringen muss.

Meine Idee war jetzt eine Kopie der Stammdatentabelle zu machen und die Datensätze dort beinhalten die Feldnamen der jeweiligen csv Importdatei. Nun würde ich gerne die csv.Datei auswählen von der ich gerade Daten importieren möchte. Wie kann ich das jetzt umsetzen dass die Inhalte mit den Feldnamen der Quelldatei  in die Zieldatei als neue Datensätze übertragen werden. Vorab soll noch eine Prüfung stattfinden die in meinem Fall die Zählernummer(eindeutig da EU konform) und das Gewerk (Gas/Wasser)vergleicht.

Hier mal ein screenshot als Bsp:

 

Erstmal ist das der richtige Ansatz oder gibt es hier andere Möglichkeiten (keine externe Programme)? Wenn das so funktioniert im Prinzip hab ich aber jetzt das Problem wie ich das mit den Feldnamen mapping umsetze

 

Gruß Andreas

8 Antworten

null
    • Andreas_Kappes
    • vor 2 Tagen
    • Gemeldet - anzeigen

    Mein Problem ist jetzt, dass ich die Gespeicherten Tabellennamen (Daten Eingangssystem) der Quellen nicht nutzen kann mit einer select Anweisung hab gelesen das es mit eval gehen soll ist mir aber noch nicht ganz klar wie das aussehen soll

      • UweG
      • vor 2 Tagen
      • Gemeldet - anzeigen

       

      let vTblName := "TestTable";
      let xTbl := eval(--- select { vTblName } ---, this);
      xTbl[Name = "UweG"].number(Nr)
      • Andreas_Kappes
      • vor 2 Tagen
      • Gemeldet - anzeigen

       

      Zuerst mach ich das ja jetzt mit dem Tabellenname muss ich das auch mit den Feldnamen so machen?

      Aktuell werden die Daten so nicht Aktualisiert

      "// Tabellnamen und Feldnamen in Variablen übergeben //"
      
      let Quelle := 'Daten Eingangssystem';
      let Ziel := "Turnusdaten";
      let MandantQ := Mandant;
      let WerkQ := Werk;
      let UnternehmenQ := Unternehmen;
      let SpartennummerQ := Spartennummer;
      let SparteAuswahQ := 'Sparte Auswahl';
      let VertragskontoQ := Vertragskonto;
      let AnlagennummerQ := Anlagennummer;
      let 'GeräteplatzQ' := 'Geräteplatz';
      let 'ZählernummerQ' := 'Zählernummer';
      let MaterialnummerQ := Materialnummer;
      let MaterialKurztextQ := MaterialKurztext;
      let HerstellerQ := Hersteller;
      let BaujahrQ := Baujahr;
      let EichjahrQ := Eichjahr;
      let WechseljahrQ := Wechseljahr;
      let 'ZählwerkQ' := 'Zählwerk';
      let 'ZW-ArtQ' := 'ZW-Art';
      let 'ZW-TypQ' := 'ZW-Typ';
      let VorkommaQ := Vorkomma;
      let NachkommaQ := Nachkomma;
      .
      .
      .
      .
      "// Daten aktualiesieren wenn Zählernummer in Turnusdaten vorhanden//"
      
      let xTbl := eval(---  select { Quelle }  ---, this);
      for i in xTbl do
          if i.Eingespielt = false then
              let myZNr := i.'ZählernummerQ';
              let myZ := last(select Turnusdaten where 'Zählernummer' = myZNr);
              myZ.(Mandant := i.MandantQ);
              myZ.(Werk := i.WerkQ);
              myZ.(Unternehmen := i.UnternehmenQ);
              myZ.(Spartennummer := i.SpartennummerQ);
              myZ.('Sparte Auswahl' := i.'Sparte AuswahlQ');
              myZ.(Vertragskonto := i.VertragskontoQ);
              myZ.(Anlagennummer := i.AnlagennummerQ);
              myZ.('Geräteplatz' := i.'GeräteplatzQ');
              myZ.('Zählernummer' := i.'ZählernummerQ');
              myZ.(Materialnummer := i.MaterialnummerQ);
              myZ.(MaterialKurztext := i.MaterialKurztextQ);
              myZ.(Hersteller := i.HerstellerQ);
              myZ.(Baujahr := i.BaujahrQ);
              myZ.(Eichjahr := i.EichjahrQ);
              myZ.(Wechseljahr := i.WechseljahrQ);
              myZ.('Zählwerk' := i.'ZählwerkQ');
              myZ.('ZW-Art' := i.'ZW-ArtQ');
              myZ.('ZW-Typ' := i.'ZW-TypQ');
              myZ.(Vorkomma := i.VorkommaQ);
              myZ.(Nachkomma := i.NachkommaQ);
      .
      .
      .
      .
              i.(Eingespielt := true)
          end
      end
      
    • UweG
    • gestern
    • Gemeldet - anzeigen

    Das wirst du wohl nicht mit eval() hinbekommen.
    Da ist es besser für jede csv eine eigene Importtabelle zu bauen und dann von dort die Daten in die ZielDB einzufügen.

      • Andreas_Kappes
      • gestern
      • Gemeldet - anzeigen

        hallo Uwe das wollte ich jetzt aber so nicht hören 🙂, für jede Tabelle eine eigene Importtabelle bauen wollte ich eigentlich damit vermeiden das widerspricht ja meinem anliegen. Es sollte doch Möglichkeiten geben auch Feldnamen in einer Variable zu speichern um diese dann an anderer Stelle ansprechen zu können.

      Oder muß ich mir einen anderen Weg überlegen. Eventuell ist das über API, auch wenns intern ist, möglich?

      Sinn dahinter ist eigentlich, dass Büroanwender die Feldnamenzuordnung in der Mappingtabelle eintragen können. Wenn dann z.B. eine neue Listenart kommt von einer neuen Gemeinde die wir betreuen oder einem anderen Dienstleister der für uns tätig ist.

      Gruß Andreas 

    • Pushing the Boundaries of Ninox
    • Gotje_Ing
    • gestern
    • Gemeldet - anzeigen

    Moin,

    ich kann es nicht garantieren, aber es sieht so aus, als würdest du mit der set() Funktion dieses Aufgabe lösen können. Dort können Feldnamen dynamisch übergeben werden. Das create() musst du dynamisch aufbauen, da kommt dann ggf. wieder eval() rein. 
    Schau mal, ob das in die richtige Richtung geht. 
    https://forum.ninox.com/t/q6yly90/set

      • Andreas_Kappes
      • gestern
      • Gemeldet - anzeigen

       Danke

      das schaue ich mir nächste Woche dann mal an. Ich gebe Rückmeldung 

      Gruß Andreas

    • mirko3
    • vor 13 Stunden
    • Gemeldet - anzeigen

    Hallo Andreas. Anliegend ein Script, welches eine CSV-Datei aus dem Bildfeld importiert, aus den Daten ein Object erstellt, in diesem Object die Spaltennamen ändert und dann die Originaltabelle füllt. Experimentell habe ich 3 CSV-Tabellen importiert, welche alle andere Spaltennamen (im Script header) hatten. Das Script funktioniert nur, wenn die Namenarrays gleich lang sind und die zu tauschenden Namen am selben Index im Array stehen. Vielleicht hilft es dir als Anregung. Der Feldname für das Bildfeld ist "CSV" und für das sharefile "shareCSV". Mirko

    let headerNamesOriginal := ["Vorname", "Nachname", "Geburtstag", "Alter"];
    let headerNamesCSV := ["Prénom", "Nom de famille", "Anniversaire", "Âge"];
    "------------------------------------------------------------";
    shareCSV := shareFile(CSV);
    let csv := http("get", shareCSV);
    let rows := splitx(raw(csv.result), "\r\n");
    let header := split(item(rows, 0), ";");
    let rows := rows[!= item(rows, 0)];
    "----------------build an object of Values of CSV------------";
    let objectValuesCSV := for row in rows do
            let row := split(row, ";");
            let object := {};
            for x in range(cnt(header)) do
                setItem(object, item(header, x), item(row, x))
            end;
            object
        end;
    "-------change the headernames of object of Values of CSV----";
    let objectWithNewHeader := for i in objectValuesCSV do
            let object := {};
            for key, value in i do
                let pos := index(headerNamesCSV, key);
                setItem(object, item(headerNamesOriginal, pos), value)
            end;
            object
        end;
    "------------------fill the Table-----------------------------";
    for i in objectWithNewHeader do
        (create Tabelle1).for key, value in i do
            set(this, key, value)
        end
    end
    

Content aside

  • vor 13 StundenZuletzt aktiv
  • 8Antworten
  • 55Ansichten
  • 4 Folge bereits