Zapytanie wielokrotne i budowanie tekstu

0

Witam. Programuje w Delphi7 i mam taki kod (on działa wyśmienicie ;))

sql := StrArrayJoin(['INSERT tabAktywne (ob_Id) VALUES (''',sqlResult.FieldByName('ob_Id').AsString,''');'], ' ');

ale chciałbym aby za jednym zamachem przenosił wartości z 8 kolumn naraz, bo teraz przenosi samo ob_Id.
Tutaj przykład dla 2 kolumn, aby bylo wiadomo o co mi miej więcej chodzi

sql := StrArrayJoin(['INSERT tabAktywne (ob_Id,dok_NrPelny) VALUES (''',sqlResult.FieldByName('ob_Id').AsString' , 'sqlResult.FieldByName('dok_NrPelny').AsString,'''');'], ' ');

i ten kod już nie działa. Po prostu nie ogarniam tych fiflaczków nawiasikow itp "'' ''' ' ' '
Czy ktoś mógłby napisać szablon dla 8 tabel?

1

jaki to komponent bazodanowy ?
dlaczego nie użyjesz parametrów ?

0

@Szalony Szewc: wstawiłem Twój kod w znaczniki kolorujące składnię i sam zobacz, że ten kod nawet się nie skompiluje. Narobiłeś zamieszania z tymi apostrofami. ;)

0

jaki to komponent bazodanowy ?
dlaczego nie użyjesz parametrów ?

//.....
query.sqlcommand:='INSERT into  tabAktywne (ob_Id,dok_NrPelny) VALUES (:ob_Id,:dok_NrPelny)';
query.parambyname('ob_id').asstring:=sqlResult.FieldByName('ob_Id').AsString;
//.......


0

Komponent ADO-->AdoConection1

0

to użyj parametrów zamiast bawić się z apostrofami i nawiasami

0

AdoConnection:TADOConnection + ADOQuery:TADOQuery tak to wygląda po kolei.

0
function zapytanieInsert (zapytanie:string;ADOQuery1:TADOQuery):TADOQuery;
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(zapytanie);
ADOQuery1.ExecSQL;
end;
......

zapytanieInsert.sqlcommand:='INSERT into  tabAktywne (ob_Id,dok_NrPelny) VALUES (:ob_Id,:dok_NrPelny)';
zapytanieInsert.parambyname('ob_id').asstring:=sqlResult.FieldByName('ob_Id').AsString;

Bąd:

[Warning] Unit1.pas(87): Return value of function 'zapytanieInsert' might be undefined
[Error] Unit1.pas(236): Not enough actual parameters
[Error] Unit1.pas(237): Not enough actual parameters
[Error] Unit1.pas(237): Missing operator or semicolon
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
0

podejrzewam że błędy są w wywołaniu funkcji zapytanieInsert
do tego masz funkcję która faktycznie nic nie zwraca, stąd warning

0
function StrArrayJoin(const StringArray : array of string; const Separator : string) : string;
var
  i : Integer;
begin
  Result := '';
  for i := low(StringArray) to high(StringArray) do
    Result := Result + StringArray[i] + Separator;

  Delete(Result, Length(Result), 1);
end;


sql := StrArrayJoin(['INSERT tabAktywne (ob_Id) VALUES (''',sqlResult.FieldByName('ob_Id').AsString,''');'], ' ');

Taki konstrukt dziaa...

0
sql := StrArrayJoin.sqlcommand:='INSERT into  tabAktywne (ob_Id,dok_NrPelny) VALUES (:ob_Id,:dok_NrPelny)';
sql := StrArrayJoin.parambyname('ob_id').asstring:=sqlResult.FieldByName('ob_Id').AsString;
[Error] Unit1.pas(229): Not enough actual parameters

Po prostu spróbowałem z inną funkcją -szukam rozwiązań... a może Ty na coś wpadniesz ;)

0

co jest w wierszu 229 ?

0
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('INSERT into  tabAktywne (ob_Id,dok_NrPelny) VALUES (:ob_Id,:dok_NrPelny)');
ADOQuery1.parambyname('ob_id').asstring:=sqlResult.FieldByName('ob_Id').AsString;
ADOQuery1.parambyname('dok_NrPelny').asstring:='coś tam';
ADOQuery1.ExecSQL;
0
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('INSERT into  tabAktywne (ob_Id,dok_NrPelny) VALUES (:ob_Id,:dok_NrPelny)');
240: ADOQuery1.Parameters.ParamByName('ob_Id').AsString:=sqlResult.FieldByName('ob_Id').AsString;
ADOQuery1.Parameters.ParamByName('dok_NrPelny').AsString:=sqlResult.FieldByName('dok_NrPelny').AsString;
ADOQuery1.ExecSQL;
[Error] Unit1.pas(240): Undeclared identifier: 'AsString'
[Error] Unit1.pas(241): Undeclared identifier: 'asstring'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'

Ja cały czas nad tym dumam -wygląda to coraz lepiej

0

spróbuj tak:

DOQuery1.ParamByName('ob_Id').AsString:=sqlResult.FieldByName('ob_Id').AsString;

albo tak

DOQuery1.Parameters[0].AsString:=sqlResult.FieldByName('ob_Id').AsString;
0

Już się zalogowałem i będę mógl edytować ;)

Samo ADOQuery1.Parameters:

[Error] Unit1.pas(241): Undeclared identifier: 'ParamByName'

Bo to jest funkcja ADOQuery1.ParamByName i dopier teraz można wybrać Parameters:

1.jpg

Zaraz opracuje te błędy, aby ci pokazać wyniki. Niestety żaden z tych przykładów nie wchodzi..

0

nie znam ADO, zobacz jakie property ma klasa Tparameter , może nie ma asstring i trzeba użyć czegoś innego

0

2.jpg

Tak wyglada środek TParameters komponentu ADOConnection.

0

z tego obrazka nic nie wynika
zobacz co Ci podpowiada sam edytor kodu po wpisaniu ADOQuery1.Parameters.parambyname('xxx').

0

To jest akurat dwa posty wyżej na obrazku;) Myślałem, że to Ci nie wystarcza i dlatego podesłałem coś innego ;)

0

xxx= const Value:WideString

1

może tak zadziała

ADOQuery1.Parameters.parambyname('xxx').value:='coś tam'
1

Tak jak napisał @grzegorz_so powinno zadziałać ale warto też dodać datatype odpowiadający przekazywanej wartosci:

ADOQuery1.Parameters.parambyname('xxx').value:='coś tam';
ADOQuery1.Parameters.parambyname('xxx').DataType:=ftString;

Swego czasu zmarnowałem sporo czasu jak przekazywałem czas jako parametr i musiałem podać typ ftDateTime. Wszystko jest zresztą w helpie pod F1.

0

Podsumowując: Coraz lepiej rozumiem pisanie w Delphim; Zaczynam ogarniac znaczniki kodu ;D --->nic nie dziala..

3.jpg

Query1.Parameters.ParamByName('ob_Id').Assign Values:=sqlResult.FieldByName(':ob_Id').AsString;
[Error] Unit1.pas(235): Not enough actual parameters -zatrzymuje sie po Values
1

Nie

Query1.Parameters.ParamByName('ob_Id').Assign Values

tylko

Query1.Parameters.ParamByName('ob_Id').Value

a w FieldByName(':ob_Id') wątpię żeby pole zaczynało się od dwukropka. Raczej będzie FieldByName('ob_Id'). Dwukropek był w składni z celu odwołania się do parametru a nie pola. A o co chodzi w tym zrzucie ekranu to kompletnie nie wiem. TParameters to klasa a ```
Parameters

> ##### [norniiica napisał(a)](https://4programmers.net/Forum/1453945):
> Podsumowując: Coraz lepiej rozumiem pisanie w Delphim; Zaczynam ogarniac znaczniki kodu ;D --->nic nie dziala..

A jakieś konkrety o co chodzi?
0

Dziękuję dziękuję!!! Działa. Zamieszczę cały kod dla takich jak ja ;) pewno będę korzystał.
Button6Click przepisuje wybrane wartości z jednej tabeli do drugiej -ale tylko nowo dodane ob_Id.

ostatni_ob_Id:string;

function pzapytanieSelect (zapytanie:string;ADOQuery1:TADOQuery;co:string):string;
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(zapytanie);
ADOQuery1.Open;
result:=ADOQuery1.FieldByName(co).AsString;//
end;

function fullResult (zapytanie:string;ADOQuery1:TADOQuery):TADOQuery;
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(zapytanie);
ADOQuery1.Open;
result:=ADOQuery1;
end;

procedure TForm1.Button6Click(Sender: TObject);
var
lastId,sql : string;
begin
  ADOConnection1.Connected:=False;
  ADOConnection1.Connected:=True;
  ADOQuery1.SQL.Clear;
 
  ostatni_ob_Id:=pzapytanieSelect ('SELECT MAX(ob_id)as ostatni FROM  tabAktywne;',ADOQuery1,'ostatni');
  sqlResult := fullResult ('SELECT * FROM vwZbiorcza_Pozycja WHERE ob_Id >'+ostatni_ob_Id+' ;',ADOQuery1);
  //TO DO ta petla powinna sie zatrzymac na jakims nullu
  sqlResult.First;
  while not sqlResult.EOF   do
    begin
     //OBSŁUGA Zapisu do tabAktywne
     edit1.Text:= sqlResult.FieldByName('ob_Id').AsString;

ADOQuery2.Close;
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add('INSERT INTO  tabAktywne (ob_Id,dok_DataWyst) VALUES (:ob_Id,:dok_DataWyst)');

ADOQuery2.Parameters.ParamByName('ob_Id').Value:=sqlResult.FieldByName('ob_Id').AsString;
ADOQuery2.Parameters.parambyname('ob_Id').DataType:=ftInteger;

ADOQuery2.Parameters.ParamByName('dok_DataWyst').Value:=sqlResult.FieldByName('dok_DataWyst').AsString;
ADOQuery2.Parameters.parambyname('dok_DataWyst').DataType:=ftDateTime;

ADOQuery2.ExecSQL;
zapytanieInsert(sql,ADOQuery2);
    sqlResult.Next;
//break;
  end;
end;

Kolega jeszcze wspomniał o doparametryzowaniu zapytań (DataType:=ftString) i w przypadku ob_Id jest string i to działa, ale w następnej kolumnie mam varchar(30) i (DataType:=ftvarchar(30)) już nie działa -jak tego szukać? Mam tu listę typów , ale nie jestem pewny który wybrać.

1

DataType jest typu TFieldType
Wystarczy podejrzeć dostępne typy (u mnie z wyższej wersji Delphi, w 7 nie wszystkie mogą być dostępne):

  TFieldType = (ftUnknown, ftString, ftSmallint, ftInteger, ftWord, // 0..4
    ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime, // 5..11
    ftBytes, ftVarBytes, ftAutoInc, ftBlob, ftMemo, ftGraphic, ftFmtMemo, // 12..18
    ftParadoxOle, ftDBaseOle, ftTypedBinary, ftCursor, ftFixedChar, ftWideString, // 19..24
    ftLargeint, ftADT, ftArray, ftReference, ftDataSet, ftOraBlob, ftOraClob, // 25..31
    ftVariant, ftInterface, ftIDispatch, ftGuid, ftTimeStamp, ftFMTBcd, // 32..37
    ftFixedWideChar, ftWideMemo, ftOraTimeStamp, ftOraInterval, // 38..41
    ftLongWord, ftShortint, ftByte, ftExtended, ftConnection, ftParams, ftStream, //42..48
    ftTimeStampOffset, ftObject, ftSingle); //49..51

Varchar(30) to typ tekstowy, więc ftString powinien pasować. Pamiętaj że podajesz tylko typ danych, ilość znaków nie jest ważna.

1 użytkowników online, w tym zalogowanych: 0, gości: 1