Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi FIBPlus Komponenten Frage (https://www.delphipraxis.net/64789-fibplus-komponenten-frage.html)

manfred_h 8. Mär 2006 09:42

Datenbank: Firebird • Version: 1.5 • Zugriff über: FIBPlus

FIBPlus Komponenten Frage
 
Hallo

habe da ein wirklich kleines Problem:
In einem anderen Thema haben mir marabu und sharky sehr weitergeholfen.
Und das klappt auch alles bis.. das Umsetzen auf Fibplus.

Bei diesen Befehlen habe ich in der Doku zu Fibplus wirklich kein vergleichbaren Befehl gefunden.
Ja ich weiss, ist Unglaublich und das ist mir wirklich schon fast Peinlich. :oops:

Query1.Open;
Query1.Edit;
Query1.Post;

Query1.Open; > hier erscheint die Meldung [Pascal Error] E2014 Statement expected, but expression of type 'Boolean' found
Query1.Edit; > 'TpFIBQery' does not contain a member named 'edit' // [Pascal Error] (174): E2003 Undeclared identifier: 'edit'
Query1.Post; > 'TpFIBQery' does not contain a member named 'post' // [Pascal Error] (176): E2003 Undeclared identifier: 'post'

Habe das ganze dann anstelle von Post mit ExecQuery und diversen meiner meinung nach
"ähnlichen" Befehlen getestet, aber ohne Erfolg.

Manfred

chaosben 8. Mär 2006 09:52

Re: FIBPlus Komponenten Frage
 
Hi ho!

Nehmen wir an, du hast eine funktionsfähige DB-Connection und eine Transaction die mit deinem FibQuery und der DB-Verknüpft ist. Dann ist die grobe Schrittfolge wie folgt:
Delphi-Quellcode:
DBConnection.Open;
Transaction.StartTransaction;
Query.Sql.Text:='Bli bla ...';
Query.ExecQuery;
while not Query.Eof do
begin

  Query.Next;
end;
Query.Close;
Transaction.Commit; //oder Rollback;
DBConnectionclose;
Ganz grob. :)

manfred_h 8. Mär 2006 10:03

Re: FIBPlus Komponenten Frage
 
Zitat:

Zitat von chaosben
Hi ho!

Nehmen wir an, du hast eine funktionsfähige DB-Connection und eine Transaction die mit deinem FibQuery und der DB-Verknüpft ist. Dann ist die grobe Schrittfolge wie folgt:
Ganz grob. :)

Danke das ganze habe ich eigentlich schon zusammen. Bis auf die 3 Befehle die Fibplus nicht kennt
oder so..

Delphi-Quellcode:
procedure Tfrm_tools.btn_idreplClick(Sender: TObject);
begin
    DM.pFIBDB_Gideons.Connected := True;
    DM.pFIBDS_NursingH.Open;
    DM.pFIBDS_NursingH_D.Open;
    DM.pFIBDS_NursingH_DD.Open;
    if not DM.pFIBDS_Camps.Active then DM.pFIBDS_Camps.Open;

      DM.pFIBQ_NursingH_D.Close;
      DM.pFIBQ_NursingH_D.SQL.Text := 'UPDATE Nursing_H_D SET ID_AREA = :newID WHERE id = :oldID';
      DM.pFIBQ_NursingH_D.ParamCheck := True;

      DM.pFIBQ_NursingH.Close;
      DM.pFIBQ_NursingH.SQL.Text := 'SELECT id FROM Nursing_H';
      DM.pFIBQ_NursingH.open;
        while not (DM.pFIBQ_NursingH.Eof) do
        begin
          newID := Neue_GuID;
          oldID := DM.pFIBQ_NursingH.FieldByName('id').AsString;
          DM.pFIBQ_NursingH.edit;
          DM.pFIBQ_NursingH.FieldByName('id').AsString := newID;
          DM.pFIBQ_NursingH.post;
          DM.pFIBQ_NursingH_D.ParamByName('newID').AsString := newID;
          DM.pFIBQ_NursingH_D.ParamByName('oldID').AsString := oldID;
          DM.pFIBQ_NursingH_D.ExecQuery;
          DM.pFIBQ_NursingH.Next;
  end;
Bei diesen 3 Befehlen hapert es bei mir.

DM.pFIBQ_NursingH.open;
DM.pFIBQ_NursingH.edit;
DM.pFIBQ_NursingH.post;

hab schon mit Google nach dieversen Bsp. gesucht aber auch dort nichts gefunden. :pale:
Manfred

dataspider 8. Mär 2006 10:13

Re: FIBPlus Komponenten Frage
 
Hi Manfred,

schau mal in die Hilfe von FibPlus.
Dann wirst du sehen, dass du TpFibDataSet benutzen musst.
Die Query ist nur unidirektional und von TComponent abgeleitet.

Cu, Frank

manfred_h 8. Mär 2006 10:19

Re: FIBPlus Komponenten Frage
 
Zitat:

Zitat von dataspider
Hi Manfred,

schau mal in die Hilfe von FibPlus.
Dann wirst du sehen, dass du TpFibDataSet benutzen musst.
Die Query ist nur unidirektional und von TComponent abgeleitet.

Cu, Frank

Werde es Anschauen. Danke
Manfred

Hab da auch eben was im Delphi-Forum gefunden. Da hatte jemand ein vergleichbares Problem.
Tquery in Interbase SQL-Datenbank

chaosben 8. Mär 2006 10:27

Re: FIBPlus Komponenten Frage
 
Zitat:

Zitat von manfred_h
Bis auf die 3 Befehle die Fibplus nicht kennt
oder so..

Hmmm ... wenn die Befehle von dem pFibQXXX Objekt nicht unterstützt werden, dann ist doch die Sache eindeutig. Ich vermute du hast, wie oben schon bemerkt, ein Query mit einem Dataset verwechselt. :duck:

Hansa 8. Mär 2006 12:49

Re: FIBPlus Komponenten Frage
 
Dataspider hat Recht. Ich habe hier zig Datasets und kein einziges Query etc.

Ein Grundgerüst kann so aussehen :

Delphi-Quellcode:
    DS.Close;
    DS.SelectSQL.Text := 'SELECT ......';
    DS.Open;
    if DS.IsEmpty then begin
      ShowMessage ('neuer Datensatz !');
      DS.insert;
    end
    else begin
      DS.Edit;
    ... Daten ändern
      // DS.delete;   Daten löschen
    end;
    DS.Post;

manfred_h 8. Mär 2006 20:12

Re: FIBPlus Komponenten Frage
 
Zitat:

Zitat von dataspider
schau mal in die Hilfe von FibPlus.
Dann wirst du sehen, dass du TpFibDataSet benutzen musst.
Die Query ist nur unidirektional und von TComponent abgeleitet.
Cu, Frank

Hallo hab die Hilfedatei wirklich gelesen.
Dort steht:
Using TpFIBQuery you can do the following things.
· You can get unidirectional dataset creating select statement into SQL property.
· You can do any database manipulation — insert, update and delete data, modifying metadata.
· You can execute stored procedures.

aber ich habe das ganze geändert und auf Datasets umgestellt.
Das sieht jetzt so aus:

Delphi-Quellcode:
function Neue_GuID: String;
var
  guidWork: TGUID;
begin
  CoCreateGuid(guidWork);
  Result := GUIDToString(guidWork);
end;

procedure Tfrm_tools.btn_idreplClick(Sender: TObject);
begin
    DM.pFIBDB_Gideons.Connected := True;
    DM.pFIBDS_NursingH.Open;
    DM.pFIBDS_NursingH_D.Open;
    DM.pFIBDS_NursingH_DD.Open;
    if not DM.pFIBDS_Camps.Active then DM.pFIBDS_Camps.Open;

      DM.pFIBDS_NursingH_D.Close;
      DM.pFIBDS_NursingH_D.UpdateSQL.Text := 'UPDATE Nursing_H_D SET ID_AREA = :newID WHERE id = :oldID';
      DM.pFIBDS_NursingH_D.Active := True;

      DM.pFIBDS_NursingH.Close;
      DM.pFIBDS_NursingH.SelectSQL.Text := 'SELECT ID FROM Nursing_H';
      DM.pFIBDS_NursingH.Active := True;
      while not (DM.pFIBDS_NursingH.Eof) do
        begin
          newID := Neue_GuID;
          oldID := DM.pFIBDS_NursingH.FieldByName('id').AsString;
          DM.pFIBDS_NursingH.edit;
          DM.pFIBDS_NursingH.FieldByName('id').AsString := newID;
          DM.pFIBDS_NursingH.post;
          DM.pFIBDS_NursingH_D.ParamByName('newID').AsString := newID;
          DM.pFIBDS_NursingH_D.ParamByName('oldID').AsString := oldID;
          DM.pFIBDS_NursingH_D.post;
          DM.pFIBDS_NursingH.Next;
  end;

end;
leider will das immer noch nicht. Bin echt den halben Tag heute aum Rumproieren :wall: :coder2:

habe auch nebenbei den BT SQL Monitor am laufen. Aber mit den Datasets habe ich es echt ( auch )noch nicht
geschaft dass er die IDs durch GUIDs erszt.

Manfred

PS: wenns hilft?

SQL-Code:

CREATE TABLE NURSING_H (
    ID          ID /* ID = CHAR(38) NOT NULL */,
    C_NR        T30 NOT NULL /* T30 = VARCHAR(30) */,
    U_NR        T30 NOT NULL /* T30 = VARCHAR(30) */,
    NAME        T130 /* T130 = VARCHAR(130) */,
    STR         T130 /* T130 = VARCHAR(130) */,
    PLZ         PLZ /* PLZ = VARCHAR(10) */,
    CITY        T50 /* T50 = VARCHAR(50) */,
    TEL         T20 /* T20 = VARCHAR(20) */,
    FAX         T20 /* T20 = VARCHAR(20) */,
    EMAIL       T50 /* T50 = VARCHAR(50) */,
    HOMEPAGE    T130 /* T130 = VARCHAR(130) */,
    ANZ_PL      T10 /* T10 = VARCHAR(10) */,
    WORKER      INTEGER,
    MT          SMALLINT,
    ACCEPTANCE  INTEGER,
    STATUS      INTEGER,
    MEMO        TEXT /* TEXT = BLOB SUB_TYPE 2 SEGMENT SIZE 4096 */,
    NC          INTEGER,
    CS          INTEGER,
    L_UPDATE    TIME_S /* TIME_S = TIMESTAMP */,
    STAT_UPDATE INTEGER,
    STAT_DEL    INTEGER
);
SQL-Code:
CREATE TABLE NURSING_H_D (
    ID          ID /* ID = CHAR(38) NOT NULL */,
    C_NR        T30 NOT NULL /* T30 = VARCHAR(30) */,
    U_NR        T30 NOT NULL /* T30 = VARCHAR(30) */,
    ID_AREA     ID /* ID = CHAR(38) NOT NULL */,
    D_DATE      "DATE" /* "DATE" = DATE */,
    D_C_PERSON  T50 /* T50 = VARCHAR(50) */,
    D_C_THRU    T130 /* T130 = VARCHAR(130) */,
    D_MEMO      TEXT /* TEXT = BLOB SUB_TYPE 2 SEGMENT SIZE 4096 */,
    L_UPDATE    TIME_S /* TIME_S = TIMESTAMP */,
    STAT_UPDATE INTEGER,
    STAT_DEL    INTEGER
);

manfred_h 11. Mär 2006 21:09

Re: FIBPlus Komponenten Frage
 
Es funktioniert :thumb: :P

Da mir doch mehrere Personen dabei geholfen haben möchte ich hier die Lösung bereitstellen.

Delphi-Quellcode:
var
  theOldId : String;
  theNewId : String;
  icount : Integer;


function CreateClassID: String;
var
  guidWork: TGUID;
begin
  CoCreateGuid(guidWork);
  Result := GUIDToString(guidWork);
end;



procedure TSDIAppForm.Button1Click(Sender: TObject);
begin

  DM.pFIBDB_Gideons.Open;
  DM.pFIBTrans.StartTransaction;
  DM.pFIBQ_NursingH.ExecQuery;

  icount:=0;

  while not DM.pFIBQ_NursingH.eof do
  begin

  theOldId := DM.pFIBQ_NursingH.fields[0].AsString; // there is only one field in here
  theNewId:= CreateClassID;
  DM.pFIBQ_NursingH_UPDATE.ParamByName('new_id').AsString:=theNewId;
  DM.pFIBQ_NursingH_UPDATE.ParamByName('old_id').AsString:=theOldId;
  DM.pFIBQ_NursingH_UPDATE.ExecQuery;
  inc(icount);
  DM.pFIBQ_NursingH.Next;

  end;

  DM.pFIBTrans.Commit;
  DM.pFIBDB_Gideons.Close;
  caption:=intToStr(icount);

end;
pFIBQ_NursingH:
SQL-Code:
select id from Nursing_H
order by name
pFIBQ_NursingH_UPDATE:
SQL-Code:
UPDATE Nursing_H
SET ID = :new_id
WHERE id = :old_id
und dies sind die Tabellen

SQL-Code:
/******************************************************************************/
/**                                  Tables                                 **/
/******************************************************************************/
CREATE TABLE NURSING_H (
    ID          ID /* ID = CHAR(38) NOT NULL */,
    C_NR        T30 NOT NULL /* T30 = VARCHAR(30) */,
    U_NR        T30 NOT NULL /* T30 = VARCHAR(30) */,
    NAME        T130 /* T130 = VARCHAR(130) */,
    STR         T130 /* T130 = VARCHAR(130) */,
    PLZ         PLZ /* PLZ = VARCHAR(10) */,
);

/******************************************************************************/
/**                               Primary Keys                              **/
/******************************************************************************/
ALTER TABLE NURSING_H ADD PRIMARY KEY (ID);
/******************************************************************************/
/**                               Foreign Keys                              **/
/******************************************************************************/
ALTER TABLE NURSING_H ADD FOREIGN KEY (C_NR) REFERENCES CAMPS (C_NR) ON UPDATE CASCADE;
SQL-Code:
******************************************************************************/
/**                                  Tables                                 **/
/******************************************************************************/

CREATE TABLE NURSING_H_D (
    ID          ID /* ID = CHAR(38) NOT NULL */,
    C_NR        T30 NOT NULL /* T30 = VARCHAR(30) */,
    U_NR        T30 NOT NULL /* T30 = VARCHAR(30) */,
    ID_AREA     ID /* ID = CHAR(38) NOT NULL */,
    D_DATE      "DATE" /* "DATE" = DATE */,
    D_C_PERSON  T50 /* T50 = VARCHAR(50) */,
);
/******************************************************************************/
/**                               Primary Keys                              **/
/******************************************************************************/
ALTER TABLE NURSING_H_D ADD PRIMARY KEY (ID);
/******************************************************************************/
/**                               Foreign Keys                              **/
/******************************************************************************/

ALTER TABLE NURSING_H_D ADD CONSTRAINT FK_NURSING_H_D1 FOREIGN KEY (ID_AREA) REFERENCES NURSING_H (ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE NURSING_H_D ADD FOREIGN KEY (C_NR) REFERENCES CAMPS (C_NR) ON UPDATE CASCADE;
Besten dank für Eure Hilfe. :cheers:
Manfred


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz