Strona 1 z 1

Baza danych i ComboBox

Nowy postNapisane: piątek, 28 września 2012, 13:53
przez rafalskraba
Witam,

mam problem z bazą danych oraz komponentem ComboBox. Używana technologia bazodanowa Firebird, połączenie SQLConnection.
Mam dane wyświetlane z 4 tablic w komponencie DBGrid. Przy kliknięciu w dowolny wiersz DBGrid wyświetlają mi się na odpowiednio przygotowanej formatce
dane z zaznaczonego wiersza. Nie ma problemu z komponentami typu Edit, Label.

Natomiast do komponentu DBComboBox ładują dane przy pomocy zapytania SQL. Dane są posortowane.

Kod: Zaznacz cały
SELECT.USERS.USER_NAME FROM USERS ORDER BY USERS.USERS_NAME


Potrzebują w polu ComboBox ustawić rekord odpowiadający rekordowi odczytanemu z pola DBGrid.

Pozdrawiam

Rafał

P.S. potrzebuję przykłady w wykorzystaniem komponenty DBComboBox

Re: Baza danych i ComboBox

Nowy postNapisane: piątek, 28 września 2012, 18:26
przez Cyfrowy Baron
ComboBox nie będzie współpracował z DBGrid, gdyż sterowanie DBComboBox odbywa się automatycznie przez bazę danych, gdyż to komponent bazodanowy, a zwykłe ComboBox już nie ma nic wspólnego z bazą danych.
Ten problem był już omawiany w tym wątku: http://programowanie.cal.pl/forum/viewtopic.php?f=21&t=1711#p12576

Re: Baza danych i ComboBox

Nowy postNapisane: poniedziałek, 5 listopada 2012, 15:58
przez admszczep
hmm,
Jak możesz opisz dokładnie jaki chcesz osiągnąć efekt

Re: Baza danych i ComboBox

Nowy postNapisane: środa, 7 listopada 2012, 07:41
przez rafalskraba
Witaj

chce uzyskać następujący efekt wyświetlić na nowej formatce z tabeli zapisane osoby do comboboxa posortowanie ich po nazwisku i ustawienie aktywnego indeksu na nazwisku z wybranego wiersza dbgrid.

problem ten rozwiązałem w następujący sposób:

Kod: Zaznacz cały
VData->Caption="EKP - Szczegóły projektu";
   int i=MainForm->DBGrid1->DataSource->DataSet->RecNo;
   String proj_name,date_in,date_out,users_name;
   int proj_users_id;
   Label1->Caption=MainForm->DBGrid1->DataSource->DataSet->FieldByName("PROJ_NR")->AsAnsiString;
   proj_name=MainForm->DBGrid1->DataSource->DataSet->FieldByName("PROJ_NAME")->AsAnsiString;
   Edit1->Text=proj_name.TrimRight();
   date_in=MainForm->DBGrid1->DataSource->DataSet->FieldByName("PROJ_DATE_IN")->AsAnsiString;
   MaskEdit1->Text=date_in;
   date_out=MainForm->DBGrid1->DataSource->DataSet->FieldByName("PROJ_DATE_OUT")->AsAnsiString;
   MaskEdit2->Text=date_out;
   users_name=MainForm->DBGrid1->DataSource->DataSet->FieldByName("USERS_NAME")->AsAnsiString;
   DM1->SQLQuery1->SQL->Add("SELECT USERS.USERS_ID, USERS.USERS_NAME FROM USERS ORDER BY USERS.USERS_NAME;");
   DM1->SQLQuery1->ExecSQL();
   for(DM1->SQLQuery1->Open();!DM1->SQLQuery1->Eof;DM1->SQLQuery1->Next())
   {
      ComboBox1->Items->Add(DM1->SQLQuery1->Fields->Fields[1]->AsAnsiString);
   }
   ComboBox1->ItemIndex=ComboBox1->Items->IndexOf(MainForm->DBGrid1->DataSource->DataSet->FieldByName("USERS_NAME")->AsString);


Może ma ktoś inne propozycje rozwiązania tego tematu.

Pozdrawiam

Rafał

Re: Baza danych i ComboBox

Nowy postNapisane: środa, 7 listopada 2012, 08:33
przez rafalskraba
Witam ponownie

jak w komponencie ComboBox pozbyć się pustych znaków po wczytaniu danych z bazy danych? Jak ustawić przy wyborze elementy z listy rozwijalnej combobox aby kursor zawsze był na początku wiersza.

Pozdrawiam

Rafał

Re: Baza danych i ComboBox

Nowy postNapisane: środa, 7 listopada 2012, 10:57
przez Corvis
rafalskraba,

1. Odnośnie posta gdzie wkleiłeś kod, to mam bardzo dużo uwag i zastrzeżeń - ale to wieczorem napiszę, bo masakra to zrobiłeś :)
2. Jak to pozbyć się pustych znaków ? Chodzi ci o funkcję trim ?
3. Tego wyboru, też nie kumam. Wybiera ktoś coś z comoboxa i chcesz, żeby kursor z comboboxa był na początku ?? Co masz ustawione w inspektorze obiektów comoboxa dla Style ???

Ps. Błagam używaj przecinków, bo nie da się tego czytać :twisted:

Re: Baza danych i ComboBox

Nowy postNapisane: środa, 7 listopada 2012, 22:17
przez rafalskraba
Witaj Corvis

Nie miałem innego pomysłu jak to zrobić . To co wykombinowałem nawet działa poprawnie. Jak masz uwagi chetnie je przeczytam i coś napewno z tego wyciągne.

Pozdrawiam

Rafał

Re: Baza danych i ComboBox

Nowy postNapisane: czwartek, 15 listopada 2012, 21:33
przez rafalskraba
Witaj Corvis

Miałeś dać znać odnośnie mojego kodu
Odnośnie posta gdzie wkleiłeś kod, to mam bardzo dużo uwag i zastrzeżeń - ale to wieczorem napiszę, bo masakra to zrobiłeś


a tu cisza. Moze razem coś wykombinujemy z tym kodem.

Pozdrawiam
Rafał

Re: Baza danych i ComboBox

Nowy postNapisane: piątek, 16 listopada 2012, 09:54
przez Corvis
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=1711
Trzeba 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:

KOD cpp:     UKRYJ  
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;