[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    May 2010
    Beiträge
    6

    anfänger! Feld in DataBase aktualisieren

    Hallo zusammen,
    nachdem mir hier beim ConnectionString schon toll geholfen wurde, habe ich hier ein andres Problem.

    Ändern einer Spalte/Zelle in einer DB

    mein code sieht in etwa so aus
    Code:
    procedure updateField;
    var
       aDataSet : TAdoDataSet;
    begin
          aDataSet := TAdoDataSet.Create(nil);
    aDataSet.ConnectionString := 'Provider=MSDASQL;User Id=user;Password=passwort;Data Source=rhdbd_16;Driver=iSeries Access ODBC Driver;Initial Catalog=VWWE400;Mode=ReadWrite;'
          aDataSet.CommandText :=  'update rhdbd_16.WAKO set WAAUMG ='+quotedStr(edtBadParts.Text)
                          +' where WAFIRM='+quotedStr(firm)
                          +' and WAWKNR='+quotedStr(edtWerkNummer.Text)
                          +' and WAAUNR='+quotedStr(edtAuftragsNummer.Text)
                          +' and WAAUPO='+quotedStr(edtIndex.Text);
    
          aDataSet.Active := True;
    
          aDataSet.close;
          aDataSet.free;
    end;
    So wie es hier steht stürzt das Programm AB! (zugriffsverletzung in 'cwbodbc.dll')

    wenn ich den connection string mit mode= read benutze um aus der Datenbank zu lesen funtioniert das prima mit dem Kommando
    Code:
    aDataSet.CommandText :=  'select WAAUMG from rhdbd_16.WAKO'
                          +' where WAFIRM='+quotedStr(firm)
                          +' and WAWKNR='+quotedStr(edtWerkNummer.Text)
                          +' and WAAUNR='+quotedStr(edtAuftragsNummer.Text)
                          +' and WAAUPO='+quotedStr(edtIndex.Text);
    Bin ich überhaupt auf dem richtigen weg?
    Ich hoffe mal das ist wieder nur ein Anfängerfehler und mir wird hier geholfen

    Grüße

    Stefan

  2. #2
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Hi,
    hast du schon probiert die Verbindung über ein DSN zu steuern?
    Ich bin mir auch nicht sicher ob der Connectionstring korrekt ist. Ob du einen Prover + Driver gemeinsam verwenden kannst.

    Mit folgenden String hatte ich nie Probleme:
    Code:
    ConnODBC = new OdbcConnection("Driver={Client Access ODBC Driver (32-bit)}" +
    "; System = " + vLogIn.System +
    "; UID = " + vLogIn.User +
    "; PWD = " + vLogIn.Password +
    "; DBQ = " + vLogIn.Library +
    "; CATALOGOPTIONS=1; CMT=0");
    Keine ahnung in welcher Sprache du entwickelst, du solltest jedoch ein eigenes Connection-Objekt erstellen, wenn das möglich ist.

    Die Fehlermeldung sehr seltsam aus. Hast du die Möglichkeit mittels Exeptions eine "genauere" Fehlerbeschreibung zu erhalten?
    Vielleicht so ähnlich wie:

    Code:
    try
    {
      vConnODBC.Open();
      MessageBox.Show("Verbindung hergestellt", "Connection");
      return 0; // OK
    }
      catch (Exception e)
    { 
      MessageBox.Show(e.Message);
      return -1; // Fehler
    }

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Sieht mir stark nach Brain aus .

    In der Verbindung muss auf jeden Fall cmt=0 rein, da nicht journalisiert wird.
    Den Mode kann man weglassen, ReadWrite ist default.

    Für Commands sollte man am Besten mit Parameter-Markern arbeiten, aber als String gehts auch.
    Zu beachten ist, dass lediglich Zeichenfelder in Hochkomma gesetzt werden dürfen, numerische Werte werden ohne Hochkomma übergeben.

    Hier ist jedoch auf das Dezimalzeichen (Default in Deutsch Komma) zu achten.
    Da das Komma aber auch zur SQL-Syntax gehört, ist vor und hinter einem numerischen Wert ein Leerzeichen erforderlich.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  4. #4
    Registriert seit
    May 2010
    Beiträge
    6
    Danke für die schnelle Antwort!
    Den ConnectionString habe ich geändert!
    (einfach den Provider=MSDASQL rausgeschmissen) funktioniert genauso.

    Wenn ich die Abfrage/Änderung "anders" mache
    ertwa so
    Code:
          aDataSet := TAdoDataSet.Create(nil);
          aDataSet.ConnectionString :=User Id=user;Password=passwort;Data Source=rhdbd_16;Driver=iSeries Access ODBC Driver;Initial Catalog=VWWE400;Mode=ReadWrite;';
    
    // query zusammenbasten
          aDataSet.CommandText :=  'select WAAUMG from rhdbd_16.WAKO'
                          +' where WAFIRM='+quotedStr(firm)
                          +' and WAWKNR='+quotedStr(edtWerkNummer.Text)
                          +' and WAAUNR='+quotedStr(edtAuftragsNummer.Text)
                          +' and WAAUPO='+quotedStr(edtIndex.Text);
    
    // ausführen
         try
          aDataSet.Active := True;
         except
    
             ShowMessage('Can´t open dataset!');
         end;
    // datenQuelle Editieren einschalten
          aDataSet.Edit;
          recCount := aDataSet.RecordCount;
          if recCount >0 then
          begin
    // zu ändernden wert setzen
    aDataSet.FieldByName('WAAUMG').Value := edtBadParts.Text;
          end;
    
    // änderungen posten
          try
            aDataSet.Post
          except
             ShowMessage('Write not exception!');
          end;
    // aufräumen usw......
    Wenn ich es so mache bekomme ich ein richtige Exeption und nicht "nur" eine zugriffsverletzung.

    Die heißt:
    Code:
    EOleExeption: Meldung: '[IBM][iSeries Access ODBC-Treiber][DB2 UDB]SQL7967 - PREPARE für Anweisung WAKO beendet'. Prozess wurde angehalten ....
    Vielleicht kann irgendjemand mit dieser Fehlermeldung mehr anfangen.

    Gruß

    Stefan

  5. #5
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Vielleicht ist es auch so wie Baldur sagte, dass du Strings in ein Integer-Feld zu speichern versuchst?

    Code:
    // query zusammenbasten
    aDataSet.CommandText :=  'select WAAUMG from rhdbd_16.WAKO'
          +' where WAFIRM='+quotedStr(firm) <--- Wirklich Text??
          +' and WAWKNR='+quotedStr(edtWerkNummer.Text) <--- Wirklich Text??
          +' and WAAUNR='+quotedStr(edtAuftragsNummer.Text) <--- Wirklich Text??
          +' and WAAUPO='+quotedStr(edtIndex.Text);
    Ansonsten würde ich den Update-String testhalber Hard-Coded hinterlegen. Wenn es dann funktioniert liegt der Fehler beim zusammenstellen des Strings.
    Oder du versuchst den String, der nach dem Zusammenbasteln erzeugt wurde 1:1 im STRSQL auszuführen.
    Dort sollte zumindest die gleiche Fehlermeldung kommen, und mit F1 erhälst du dann auch mehr Informationen.

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    "Prozess wurde angehalten" ist schon seltsam. Die Meldung kenne ich nicht. SQL7967 ist nur eine Fertigmeldung und dürfte keine Ausnahme auslösen.

    Allerdings kenne ich auch Tado nicht.

    In ADO gibt es eine Supports-Eigenschaft, in der man prüfen kann, ob überhaupt ein Update erlaubt ist.

    Natürlich ist der Feldtyp wichtig.
    WAAUNR und WAAUPO sind z.B. numerisch!
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  7. #7
    Registriert seit
    May 2010
    Beiträge
    6
    Habe die numerischen Felder numerisch gemacht oder zumindest nicht mehr in Hochkomma "gepackt". Keine Änderung!

    Wenn die SQL - Select Abfragen funktionieren, ohne auf den Datentyp zu achten, kann es dann trotzdem sein, dass das beim setzen nicht funktioniert?

    Habe mal die Ganzen Supports ausgeben lassen (die sind vom typ cursorOptions)!

    hier das ergebnis
    Code:
    HoldRecords supported
    MovePrevious supported
    AddNew supported
    Delete supported
    Update supported
    Bookmark supported
    ApproxPosition supported
    UpdateBatch supported
    Resync supported
    Notify supported
    Find supported
    hm, update wird supported!
    muss der cursor irgendiwe eingestellt werden?

    was ist denn in der Regel vorzuziehen
    Code:
    Ändern des Wertes eines Feldes das mit Select ermittelt wurde und dann  update mit table.Post
    ODER
    Code:
    eine SQL Abfrage wie 
    UPDATE table SET feld=3 WHERE bedingung;
    BTW: funktioniert bei mir beides nicht, im Moment

    Gruß Stefan


    Und was ganz andres: liegt die Schmalheit des Antwort Editierfensters am Browser? (ich habe hier Firefox 3.5)oder ist das einstellbar?

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Ohne dir nahetreten zu wollen, aber die Maschine VWWE400 kenne ich ganz gut.
    Ich denke, hier ist der Zugriffsschutz PCSACC/400 aktiv so dass du nicht updaten darfst!

    PS:
    Der User RHPCPGM darf das nicht so einfach.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  9. #9
    Registriert seit
    May 2010
    Beiträge
    6
    Ok, wie gesagt ich bin blutiger Anfänger!
    Dann werde ich mir jetzt erst mal einen User mit ausreichenden Rechten zum updaten beschaffen.
    Danke erstmal.

    Gruß
    Stefan

  10. #10
    Registriert seit
    Dec 2000
    Beiträge
    281

    Update WAKO

    Hallo Stefan,
    also die Felder WAFIRM und WAWKNR sind Alpha.
    WAAUNR und WAAUPO sind Num (wie Baldur gesagt hat)
    Das Feld WAAUMG ist num (Ist ja die Auftragsmenge)

    Aber kann es sein, dass du einen Update über ODBC nur auf eine Indexierte Datei machen kannst?

    Dann müßte die WAKO01 deine Datei sein. In XPPS gibt es eine ganze Menge logischer Dateien.

    Aber noch ein Hinweis, die Menge nur im Auftragskopf ändern bringt evtl. nicht viel. Du must auch die OFMA berücksichtigen.


    Klaus

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Auf dem obigen System ist das Sicherheitstool PCSACC/400 aktiv.
    Es darf ja nun mal nicht jeder irgendwelche Daten ändern (ausser mir).
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  12. #12
    Joe is offline [professional_User]
    Registriert seit
    Mar 2001
    Beiträge
    365
    Hallo.

    Der Quellcode sieht nach Delphi aus.
    Lass bei den numerischen Feldern die "quotedstr" weg.

    Gruß Joe

Similar Threads

  1. Feld im Subfile Satz aktualisieren
    By Hubert in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 26-08-07, 09:10
  2. Nur einzelnes Feld vor write ändern
    By RaMai in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 28-11-06, 07:59
  3. DIAM – Database Impact Analyser & Modifier
    By Burgy Zapp in forum NEWSboard Server Software
    Antworten: 0
    Letzter Beitrag: 29-06-06, 17:19
  4. Prüfung, ob Eingabe in Feld
    By M Scheid in forum NEWSboard Programmierung
    Antworten: 7
    Letzter Beitrag: 12-06-06, 13:02
  5. ILE Feld in Feld ansprechen
    By jogisarge in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 10-05-06, 16:26

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •