Potrzebna mi jest autonumeracja w kolumnie 'LP' tabeli, tak by po dodaniu lub usunieciu któregos rekordu była odświeżana numeracja. Dodałem więc taka linijke kodu: form1.IBTable1.FieldByName('Lp').FieldKind:=fkCalculated; Ale wywala mi błąd: 'IBTable1: Field 'LP' not found'. Nie wiem co robie źle bo mam kolumnę LP
papi napisał(a)
Potrzebna mi jest autonumeracja w kolumnie 'LP' tabeli, tak by po dodaniu lub usunieciu któregos rekordu była odświeżana numeracja. Dodałem więc taka linijke kodu: form1.IBTable1.FieldByName('Lp').FieldKind:=fkCalculated; Ale wywala mi błąd: 'IBTable1: Field 'LP' not found'. Nie wiem co robie źle bo mam kolumnę LP
<ort>Rozumie </ort>że potrzebujesz mieć ponumerowane wiersze. Więc jeśli chcesz użyć do tego pola kalkulowanego, to musisz go sobie najpierw utworzyć. Albo poprzez IDE albo z kodu. Polecam pierwszą metodę. Dodajesz pole, ustawiasz Integer, i typ Calculated.
Idąc dalej trzeba jakoś przypisać numery do tych pól. Nie wiem na ile zadziała RecNo, ale możesz sprawdzić, i dać w metodzie OnCalcField
form1.IBTable1.FieldByName('Lp').AsInteger := ...RecNo;
No właśnie cały widz polega na tym że musze tworzyc to pole z poziomu kodu, dlatego ze pisze program w którym mam tworzyc nowe tabele, edytowac je, usuwać a wtych tabelch także dodawac nowe pola i usuwać je. Właśnie pole 'LP' ma być dodawane automatycznie w momencie utworzenia tabeli a gdy w nowo utworzonej tabeli bede usuwał wiersze lub dodawał to ma sie zmieniać automatycznie numeracja w polu 'LP'
papi napisał(a)
No właśnie cały widz polega na tym że musze tworzyc to pole z poziomu kodu, dlatego ze pisze program w którym mam tworzyc nowe tabele, edytowac je, usuwać a wtych tabelch także dodawac nowe pola i usuwać je. Właśnie pole 'LP' ma być dodawane automatycznie w momencie utworzenia tabeli a gdy w nowo utworzonej tabeli bede usuwał wiersze lub dodawał to ma sie zmieniać automatycznie numeracja w polu 'LP'
-
Wydaje mi się (głowy nie dam) że jeśli chcesz mieć pole kalkulowane, to wówczas będziesz musiał utworzyć wszystkie pola (również te fkData). Tworzenie jest bardzo proste (Add ...)
-
<ort>Prubuje </ort>zgadnąć do czego ma taki program służyć - jedyne co mi przychodzi do głowy to jakiś edytor baz danych. W każdym razie, nie wiem co chcesz osiągnąć dodatkowo, ja widzę dwa kierunki:
A. utworzenie fizycznego pola w tabeli
B. numeracja po stronie klienta
W przypadku A, musisz dbać o usuwanie dziur z numeracji. Poza tym musisz wiedzieć jak te pola muszą być sortowane żeby je numerować.
Co do przypadku B, to tak, jeśli to faktycznie ma być program do edycji baz:
- to może zastanów się nad rezygnacją z dbgrid'a i wybierz stringgrid'a. Kolumn nie będziesz miał pewnie > 100, więc wydajnościowo to specjalnie się nie popsuje.
- jeśli chcesz korzystać z <ort>dobrodziejsc </ort>komponentów bazodanowych, to zastanów się może nad połączeniem DataSetProvider + ClientDataSet. W CDS jest coś takiego jak internalcalc i łatwo by taką numerację można było zrobić
Napisz coś więcej co chcesz zrobić, to może się coś wymyśli.
Postaram sie wytłumaczyć jak ma wygladać ten program. Tworze w interbase pusta baze danych. Z poziomu delphi wpisuje w edicie nazwe tabeli klikam buttona(Dodaj tabele) i tabela zostaje dodana do bazy( i tak za kazdym razem jak chce dodac nowa tabele). W ListBoxie wyswietlaja mi sie dodane tabele. Klikajac na nazwę tabeli z listy ListBoxa przechodze do nastepnej formatki na której mam DBGrid w którym wyświetlane są pola danej Tabeli(Lub bedą wyświetlane po ich utworzeniu) .Na tej formatce moge usuwać i dodawac nowe pola wybierając z combobox typ kolumny(Wprowadzone kolumny wyświetlają mi się w DBGridzie). Ale jedna kolumna ma mi sie tworszyć już w momencie dodawania nowej tabeli i to jest właśnie kolumna 'LP'. Kolumna 'LP' ma być nieedtytowalna przez użytkownika, mają się w niej wyświetlać numery rekordów(1,2,3 itd gdy dodaje nowy rekord). Jesli załóżmy mam 10 rekordów i skasuje czwarty rekord to: piąty przeskoczy mi na czwarty, szósty na piąty itd. No i chciałbym żeby w numeracji nie było dziury(tak żeby znów było ładnie ponumerowane: 1,2,3,4,5,6,7,8,9). Chciałbym żeby to było wyświetlane w DBGridzie ponieważ najlepiej go znam, tamych komponentów przyznam sie nie używałem jak dotąd.
Żeby mieć ponumerowne rekordy w bazie, to musisz zadbać właśnie o te dziury. Poza tym numeracja musi być zgodna z jakims sortowaniem. Żeby nie było tych dziur to musisz troche kombinować. Może wstawiać ostatni numer w miejsce usuniętego, ale jakąś prockę przenumerowywującą. Moim zdaniem, to bez sensu. Czy Tobie te numery są potrzebne tylko po to żeby je wyświetlić, jako numer rekordu ? Bo jeśli tak to rób to po stronie klienta na polach kalkulowanych, a nie po stronie bazy. Każda tabela powinna mieć swój klucz główny oparty na generatorze, a nie jakiś LP. Po co ma być to LP ? I czemu tak Ci zależy żeby nie było dziur ?
Pytanie jeszcze czy Ty czasem pod pojęciem rekordu nie rozumiesz tutaj kolumny tabeli tabeli ? Jeśli chodzi Ci o ponumerowanie kolumn, to takie coś już raczej jest zrobione w tabelach systemowych. Nie wiem jak to jest w interbase ale w firebirdzie to jest tabela RDB$RELATION_FIELDS
SELECT RDB$RELATION_NAME Tabela, RDB$FIELD_NAME Pole, RDB$FIELD_POSITION Pozycja
FROM RDB$RELATION_FIELDS
WHERE RDB$SYSTEM_FLAG = 0
ORDER BY 1,3,2