Zapomniałem ... Sorry.
Dobra od początku:
1. Zapytania SQL powinny być zawarte w procedurach składowanych, wywoływanych z odpowiedniego miejsca w kodzie programu. Pisałem o tym już w tym dziale. Czyli twój kod pobierający użytkowników powinien:
a) Zostać przeniesiony do DataModule
b) Zostać wywołany za pomocą procedury składowanej - późniejsza konserwacja kodu jest prosta. Przykład chcesz zmienić sortowanie - to twoim sposobem musisz kompilować program
2. Sposób wczytywania danych do ComboBoxa pisałem o tym już wcześniej tutaj:
viewtopic.php?f=21&t=1711Trzeba odwoływać się do klucza jednoznacznie identyfikującego dany wiersz w bazie danych. Co jeżeli będziesz miał 30 takich samych nazwisk ?
3. DM1->SQLQuery1->ExecSQL(); wywołuje się dla zapytania które nie zwraca danych !!! do tego co ty robisz powinna być użyta funkcja Open() !!!!
4. Dla zapytań które zwracają listy danych w postaci: KLUCZ_GŁÓWNY; WARTOŚĆ_STRING utwórz sobię uniwersalną funkcję w DataModule która będzie ci takie listy zwracać przykład:
bool __fastcall TDtmMain::sqlListFromSql(String Sql, TStrings*lst) {
bool result = true;
DoOnTekst("Lista z SQL " + Sql ,ttNormal);
if(PolaczenieBaza()==false) return false;
lst->Clear();
sqldtsMain->Close();
sqldtsMain->CommandText = Sql;
try {
sqldtsMain->Open();
while(!sqldtsMain->Eof) {
lst->AddObject(
sqldtsMain->Fields->Fields[1]->AsString,
(TObject*)sqldtsMain->Fields->Fields[0]->AsInteger
);
sqldtsMain->Next();
}
sqldtsMain->Close();
}
catch(EDatabaseError &er) { result = false; WypiszBledyEDatabaseError(er); }
catch(TDBXError &er) { result = false; WypiszBledyTDBXError(er); }
catch(Exception &er) { result = false; WypiszBledyException(er); }
catch(...) { result = false; DoOnTekst("Nieznany wyjątek" ,ttSqlError); }
return result;
}
5. Dobrym zwyczajem jest tworzyć w programie struktury odwzorowujące table w bazie danych i pobierać potem dane do struktury żeby unikać potem czegoś takiego:
proj_name=MainForm->DBGrid1->DataSource->DataSet->FieldByName("PROJ_NAME")->AsAnsiString;
date_in=MainForm->DBGrid1->DataSource->DataSet->FieldByName("PROJ_DATE_IN")->AsAnsiString;