Dovrei richiamare una procedura alla quale passare un array contenente gli ID dei record di Database da eliminare.
Di fronte a tale prospettiva, ho pensato di passare alla procedura che dovrà occuparsi dell'eliminazione concreta dei record interessati, tutti i codici ID da cancellare dentro una variabile di tipo array. Gli array, come meglio chiarito qui (https://www.lazaruspascal.it/index.php?topic=2570.msg16569#msg16569), sono passati per riferimento.
Prendendo forza da ciò, ho proceduto a preparare il codice necessario:
var
. . .
striCodId2Canc: String = '';
tabSplit: TStringArray;
tbEl: TstringArray;
tbIDmovimgg: TstringArray;
. . .
sql:= 'SELECT movimgg.IdMovvgg AS IDMovimgg, partmovv.IdPartGlob AS IDpartmovv FROM movimgg, partmovv, piancont WHERE movimgg.DtCoMovgg = partmovv.DtCoPartGlob';
sql:= sql + ' AND movimgg.OraSolMovgg = partmovv.OraSolPartGlob AND movimgg.DtCoMovgg = ' + Form9.dataFin + ' AND movimgg.OraSolMovgg >= 235000 AND movimgg.OraSolMovgg <= 235959';
sql:= sql + ' AND movimgg.CoVocMovvgg = piancont.NumVoce AND piancont.ContrPartSiNo = "Q" ORDER BY movimgg.NuProMovvgg, movimgg.CoVocMovvgg';
striCodId2Canc:= PreparaCodIdCanc(sql);
. . .
tabSplit:= striCodId2Canc.Split(chr(13));
striCodIDmovimgg:= tabSplit[0]; // cioè tutti i codici ID della tabella di DB movimgg
tbEl:= striCodIDmovimgg.Split(chr(9));
setLength(tbIDmovimgg, Length(tbEl));
for i:= 0 to (Length(tbEl) - 1) do
begin
tbIDmovimgg[i]:= tbEl[i];
end;
CancMovvFinIniAnno(tbIDmovimgg, 'movimgg', 'IdMovvgg'); // riga 4036
. . .
Il Compilatore però non è però d'accordo con le mie assegnazioni perchè mi segnala il seguente errore:
frm9.pas(4036,37) Error: Incompatible type for arg no. 1: Got "TStringArray", expected "AnsiString"
Ho provato a modificare l'array da "TStringArray" a "AnsiString", ma non ci sono riuscito per chè un tipo di array ansistring non è assegnabile (l'unico che ho trovato è "TAnsiStringBuilder").
Non capisco perchè non posso assegnare un array TStringArray. Pensavo ad un conflitto di assegnazioni nelle variabili dichiarate, ma non ho trovato niente. Non immagino perciò come potere procedere
Prova così:
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
procedure Cancella(elenco: array of string);
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
var prova: array of string;
{ TForm1 }
procedure TForm1.Cancella(elenco: array of string);
var ID: string;
begin
for ID in elenco do
begin
///CANCELLA IL RECORD QUI
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
SetLength(prova, 10);
///RIEMPI L'ARRAY
///.............
//Cchiama la canecllazione
Cancella(prova);
///ELIMINA l'ARRAY
SetLength(prova, 0);
end;
end.
Ho trovato il conflitto di dichiarazioni.
Non si vede nel codice che ho postato, perchè veniva scatenato dalla dichiarazione riportata nelle procedura chiamata:
procedure CancMovvFinIniAnno(tbIDMovim: String; nomeTbDB, nomeCampoID: String); <-- prima
procedure CancMovvFinIniAnno(tbIDMovim: array of String; nomeTbDB, nomeCampoID: String); <-- dopo
Sostituendo la prima riga con la seconda, la segnalazione è scomparsa.
Grazie, comunque. ;)