Baza danych i ComboBox

Problemy związane z tworzeniem i zarządzaniem programami bazo-danowymi.
Regulamin działu


Zadając pytania dotyczące baz danych należy podawać szczegółowe informacje o bazie danych nad którą się pracuje, czyli:

  • Rodzaj serwera bazodanowego: MySql, MSSQL, Oracle itp.
  • Wersja bazy danych
  • Technologia bazodanowa używana w programie: ADO, DbExpress, InterBase
  • Komponenty użyte do zestawienia połączenia: ADOConnection, SqlConnection
  • Sposób zestawienia komponentów bazodanowych np. DataSet - DataSource - DbGrid lub DataSet - DataSetProvider - ClientDataSet - DataSource - DbGrid
  • Jeżeli używane były biblioteki innych firm niż Borland, CodeGeer i Embarcadero proszę podać ich nazwy, numer wersji i adres źródła.

Baza danych i ComboBox

Nowy postprzez rafalskraba » piątek, 28 września 2012, 13:53

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
"Jednym z rodzajów szczęśliwości jest zdolność podejmowania dobrych decyzji."

- Platon-
Avatar użytkownika
rafalskraba
Intelektryk
Intelektryk
 
Posty: 122
Dołączył(a): czwartek, 5 marca 2009, 10:20
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 7 x64
Kompilator: RAD Studio XE2 Update 4 HotFix 1
SKYPE: rafal.skraba
Gadu Gadu: 0
    Windows XPFirefox

Re: Baza danych i ComboBox

Nowy postprzez Cyfrowy Baron » piątek, 28 września 2012, 18:26

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
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Baza danych i ComboBox

Nowy postprzez admszczep » poniedziałek, 5 listopada 2012, 15:58

hmm,
Jak możesz opisz dokładnie jaki chcesz osiągnąć efekt
Avatar użytkownika
admszczep
Homos antropiczny
Homos antropiczny
 
Posty: 66
Dołączył(a): wtorek, 3 listopada 2009, 23:25
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows XP PRO SP3
Kompilator: Embarcadero RAD Studio XE
C++Builder XE
Gadu Gadu: 0
    Windows XPFirefox

Re: Baza danych i ComboBox

Nowy postprzez rafalskraba » środa, 7 listopada 2012, 07:41

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ł
"Jednym z rodzajów szczęśliwości jest zdolność podejmowania dobrych decyzji."

- Platon-
Avatar użytkownika
rafalskraba
Intelektryk
Intelektryk
 
Posty: 122
Dołączył(a): czwartek, 5 marca 2009, 10:20
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 7 x64
Kompilator: RAD Studio XE2 Update 4 HotFix 1
SKYPE: rafal.skraba
Gadu Gadu: 0
    Windows XPFirefox

Re: Baza danych i ComboBox

Nowy postprzez rafalskraba » środa, 7 listopada 2012, 08:33

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ł
"Jednym z rodzajów szczęśliwości jest zdolność podejmowania dobrych decyzji."

- Platon-
Avatar użytkownika
rafalskraba
Intelektryk
Intelektryk
 
Posty: 122
Dołączył(a): czwartek, 5 marca 2009, 10:20
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 7 x64
Kompilator: RAD Studio XE2 Update 4 HotFix 1
SKYPE: rafal.skraba
Gadu Gadu: 0
    Windows XPFirefox

Re: Baza danych i ComboBox

Nowy postprzez Corvis » środa, 7 listopada 2012, 10:57

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:
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome

Re: Baza danych i ComboBox

Nowy postprzez rafalskraba » środa, 7 listopada 2012, 22:17

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ł
"Jednym z rodzajów szczęśliwości jest zdolność podejmowania dobrych decyzji."

- Platon-
Avatar użytkownika
rafalskraba
Intelektryk
Intelektryk
 
Posty: 122
Dołączył(a): czwartek, 5 marca 2009, 10:20
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 7 x64
Kompilator: RAD Studio XE2 Update 4 HotFix 1
SKYPE: rafal.skraba
Gadu Gadu: 0
    Windows 7Firefox

Re: Baza danych i ComboBox

Nowy postprzez rafalskraba » czwartek, 15 listopada 2012, 21:33

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ł
"Jednym z rodzajów szczęśliwości jest zdolność podejmowania dobrych decyzji."

- Platon-
Avatar użytkownika
rafalskraba
Intelektryk
Intelektryk
 
Posty: 122
Dołączył(a): czwartek, 5 marca 2009, 10:20
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 7 x64
Kompilator: RAD Studio XE2 Update 4 HotFix 1
SKYPE: rafal.skraba
Gadu Gadu: 0
    Windows 7Firefox

Re: Baza danych i ComboBox

Nowy postprzez Corvis » piątek, 16 listopada 2012, 09:54

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;
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Bazy danych

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 3 gości

cron