Autonumeracja pola w tabeli

0

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

0
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;

0

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'

0
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'

  1. 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 ...)

  2. <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.

0

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.

0

Ż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

1 użytkowników online, w tym zalogowanych: 0, gości: 1