Usuwanie rekordów z tabeli.

Odpowiedz Nowy wątek
2006-11-28 23:05
0

Może, ktoś ma pomysł jak usuwać rekordy z tabeli dane w której są umieszczone rekordy baza? Dispose? jeżeli tak to jak jej użyć bo mi się pomysły skończyły?

const N=1000;
      NazwaPliku='baza_danych.dat';

type baza= record
        imie: string[20];
        ntstac: string[10];
        ntkom: string[9]
        end;

var dane:array[1..N] of baza;
    wybor: char;
    i, j, nA, LbPoz: integer;
    selektor: string[20];

Pozostało 580 znaków

2006-11-28 23:22
0

jak to jest pascal to jedynie przesunąć wszystkie, które są "nad" usuwanym o 1 pozycję w dół

jak to delphi to zamiast tablicy zastosować TList


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2006-11-29 12:34
0

Dobra zilustrujmy problem:

user image

chce usunąć rekord w tablicy oznaczony szarym paskiem. Jak to zrobić? Może, ktoś podać konkretny wycinek kodu?


Pozostało 580 znaków

2006-11-29 13:12
0
Halva napisał(a)

Dobra zilustrujmy problem:

user image

chce usunąć rekord w tablicy oznaczony szarym paskiem. Jak to zrobić? Może, ktoś podać konkretny wycinek kodu?

Misiek już Ci napisał...
Przyrównujesz do siebie indeksy kolejnych rekordów z tablicy dane, po tym wierszu.

dane[4]:=dane[5];
dane[5]:=dane[6];

itd.(tylko nie rób ściemy i użyj pętli ;))
A ostatni rekord po przypisaniu po prostu czyścisz

Pozostało 580 znaków

2006-11-29 17:13
0

Ok dobra, wartość dane[4] zostanie zastąpiona wartością dane[5] i tak dalej. Załóżmy że tabela ma 5 rekordów, które są zapełnione jakimiś danymi, imie, numer stacjonarny i komórkowy. Ja chce usunąć dane klienta z rekordu 4. przypisuje dane[4] zawartość dane[5], poczym czyszcze dane[5].
W ten sposob klient z pozycji 5 przenosi sie na poz 4 kasujac klienta z poz 4. Wszyskto bylo by ok, gdyby nie to, ze po wypisaniu zawartości tabeli, program pokazuje dalej 5 wersów tylko że 5 jest pusty. Weźmy na przykład taką sytuację, gdy do tabeli, nowe rekordy dopisywane sa dnamicznie, i załóżmy ze jest ich już 980, wg. tej metody usuwania, usuwamy 300 ostatnich rekordow. Owszem, zostaną one opróżnione, ale nadal beda istniec, i program przy wypisywaniu ich wyswiteli 980 rekordow tylko ze 300 ostatnie bedzie puste, a ja chce zeby on nie pokazywal mi tych 300 pustych wpisow bo po co to komu?

Chyba, ze znacie jakąś inną metodę czyszczenia ostatniego rekordu niż ja. Jak go czyścicie?


Pozostało 580 znaków

2006-11-30 00:30
0

ech szkoda słów - żeby nie rozumieć własnegoi programu ...

N=1000;
dane:array[1..N] of baza;

twój kod :> to by wynikało, że zawsze masz 1000 rekordów, niezależnie od tego, czy jakiś jest wypełniony czy pusty.


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2006-11-30 10:59
0

Ok problem rozwiąany następująco:

procedure UsunWpis;
begin
  write('Podaj imie abonenta ktory ma zostac usuniety: ');
  readln(selektor);
   for i:=1 to LbPoz do
     if selektor=dane[i].imie then
       for i:=i to LbPoz do
         begin
           dane[i].imie:=dane[i+1].imie;
           dane[i].ntstac:=dane[i+1].ntstac;
           dane[i].ntkom:=dane[i+1].ntkom;
         end;
       LbPoz:=LbPoz-1;
       ZapiszNaDysku(NazwaPliku);
end;

Przypisujemy wybranemu wersowi wartość następnego i tak w pętli dochodzimy do ostatniego wersu. Potem zapisujemy to wszystko do pliku i gotowe :) A mam pytanie, co będzie gdy tabela będzie wypełniona cała? Czy w takim wypadku ostatni wers zostanie podwojony? Czy moze komenda przypisania do wersu 1000 wartosci wersu 1001, po prosty wyczyści wers 1000, bo przecież wers 1001 nie istnieje?


Pozostało 580 znaków

2006-11-30 11:44
0

błąd


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2006-11-30 11:57
Krzychu0000
0
Misiekd napisał(a)

jak to delphi to zamiast tablicy zastosować TList

<ot>Tak z ciekawości spytam, bo jeszcze nie korzystałem z TList. Co jest szybsze, TList czy dynamiczne tablice? Chodzi mi o takie operacje jak szukanie, dodawanie, usuwanie przy ilości rekordów ok 10 000.</ot>

Co do głównego tematu, widziałem gdzieś przykład szybkiego usuwania z dynamicznej tablicy za pomocą Copy, coś jak:

Tablica[usuwany_index] := Copy(Tablica, usuwany_index+2, Length(Tablica)-(usuwany_index+2));
SetLengt(Tablica, Length(Tablica)-1);

... czy jakoś tak

Pozostało 580 znaków

2006-11-30 12:06
0

TList jest oparta o dynamiczną tablicę ale ma zaimplementowanie dodawanie, usuwanie, przenoszenie, zamiane miejscami i wyszukiwanie konkretnego elementu


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2006-11-30 13:18
0

jaka zasada dzialania na tablicy raz tworzymy taka sama tablice ale o liczbie elementow mniejszej o 1
w petli ustawiamy wartosci odopwiednio (w kodzie to jest x) jak i <> tego co chcemy usunac to dodajemy do x 1 i wlasnie ten element dodajemy z tablicy glownej [i], pozniej nalezy tylko odwrocic proces czyli z tablicy tymaczasowej zrobic: to co jest var dym : tsmoke dajemy setlength(tablicaglowna_zktorej_bralismy_wartosci,length(tablica_tymczasowa)); pozniej tylko przypisanie wartosci jednej tablicy do drugiej

procedure delete_smoke(var dym : tsmoke; index : integer);
var
temp : array of tsmoke_nfo;
i : integer;
x : integer;
begin
setlength(temp,length(dym.smoke_quad)-1);

x := -1;
for i:=0 to high(dym.smoke_quad) do
if i <> index then begin
x:=x+1;
temp[x].pos.x := dym.smoke_quad[i].pos.x;
temp[x].pos.y := dym.smoke_quad[i].pos.y;
temp[x].pos.z := dym.smoke_quad[i].pos.z;
temp[x].size := dym.smoke_quad[i].size;
temp[x].visible := dym.smoke_quad[i].visible;
end;

setlength(dym.smoke_quad,length(temp));

for i:=0 to high(dym.smoke_quad) do begin
dym.smoke_quad[i].pos.x := temp[i].pos.x;
dym.smoke_quad[i].pos.y := temp[i].pos.y;
dym.smoke_quad[i].pos.z := temp[i].pos.z;
dym.smoke_quad[i].size := temp[i].size;
dym.smoke_quad[i].visible := temp[i].visible;
end;

end;

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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