<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Forum PostgreSQL - Wykrycie referencji]]></title>
	<link rel="self" href="http://forum.postgresql.org.pl/extern.php?action=feed&amp;tid=2&amp;type=atom"/>
	<updated>2008-02-11T10:35:24Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.postgresql.org.pl/viewtopic.php?id=2</id>
		<entry>
			<title type="html"><![CDATA[Odp: Wykrycie referencji]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=18#p18"/>
			<content type="html"><![CDATA[[quote=Rady]Mam pytanko jaki typ danych z Postgresa będzie najbardziej odpowiedni dla danych Delphi typu memo ??[/quote]
Ja używam "text" sam się dostosowuje do długości danych tylko nalezy pamietac aby dane przeslac w calosci np. "Memo1.Text";

Zwróć uwagę na posty powyżęj dałem tam przykłady tabel i jest tam określony typ danych typu "text"]]></content>
			<author>
				<name><![CDATA[rafko]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=8</uri>
			</author>
			<updated>2008-02-11T10:35:24Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=18#p18</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Wykrycie referencji]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=16#p16"/>
			<content type="html"><![CDATA[Mam pytanko jaki typ danych z Postgresa będzie najbardziej odpowiedni dla danych Delphi typu memo ??]]></content>
			<author>
				<name><![CDATA[Rady]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=6</uri>
			</author>
			<updated>2008-02-10T21:06:24Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=16#p16</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Wykrycie referencji]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=13#p13"/>
			<content type="html"><![CDATA[Ok przekonałeś mnie. W sumie używałem transakcji wtedy kiedy uważałem że wszystkie operacje powinny zostać wykonane.
W zasadzie nie myślałem o tym aby dla jednej operacji INSERT lub UPDATE używać transakcji.]]></content>
			<author>
				<name><![CDATA[rafko]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=8</uri>
			</author>
			<updated>2008-02-10T19:40:06Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=13#p13</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Wykrycie referencji]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=11#p11"/>
			<content type="html"><![CDATA[W jakimś stopniu na pewno wydłuży czas oczekiwania na modyfikacje ale bazy Ci się nie rozjadą, czas wykonania transakcji jest praktycznie znikomy z tego co zauważyłem na Postgresie żeby klient zobaczył jakąkolwiek różnicę musiało by z 10 osób modyfikować tą samą daną w tym samym momencie, a i tak wydaje mi się że stabilność bardziej się liczy. Na lokalnych bazach można to ominąć ale na sieciowych ja bym nie ryzykował.]]></content>
			<author>
				<name><![CDATA[Rady]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=6</uri>
			</author>
			<updated>2008-02-08T15:51:34Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=11#p11</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Wykrycie referencji]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=10#p10"/>
			<content type="html"><![CDATA[[quote=Rady]Daj sobie jeszcze obsługę transakcji dla Update i Insert to będziesz miał pewniachę że baza Ci się nie rozjedzie przy kilku klientach działających jednocześnie.[/quote]
słuszna uwaga aczkolwiek mam już funkcje przygotowane pod transakcje pytanie tylko czy to nie wydłuży czasu zapisu danych.]]></content>
			<author>
				<name><![CDATA[rafko]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=8</uri>
			</author>
			<updated>2008-02-08T11:06:20Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=10#p10</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Wykrycie referencji]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=7#p7"/>
			<content type="html"><![CDATA[Widze że miałeś zdefiniowane zależności w tabeli to na "Try'ach" dało by sie złapać błąd podczas usuwania, ale pomysł z if i message też niezły. Wiesz jak bawiłem się na Delphi to łapałem właśnie komunikat błędu z serwera podczas próby usunięcia wartości klucza obcego bez usuwania bez usuwania jego poprzednika PK.

Tylko używałem jeszcze przy tworzeniu FK "on update cascade"


Daj sobie jeszcze obsługę transakcji dla Update i Insert to będziesz miał pewniachę że baza Ci się nie rozjedzie przy kilku klientach działających jednocześnie.]]></content>
			<author>
				<name><![CDATA[Rady]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=6</uri>
			</author>
			<updated>2008-02-07T21:24:20Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=7#p7</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Wykrycie referencji]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=5#p5"/>
			<content type="html"><![CDATA[Ok Tabela pierwsza
  TabelaJednostekMiar = '(id bigserial not null, '+
                                  'nazwa_jednostki varchar(64) not null, '+
                                  'PRIMARY KEY(id), UNIQUE (nazwa_jednostki));';

  TabelaTypowTowarow = '(id bigserial not null, '+
                       'nazwa_typu text null, '+
                       'PRIMARY KEY(id), UNIQUE (nazwa_typu));';

  TabelaTowarow = '(id bigserial not null, '+
                  'flag boolean not null, '+
                  'nazwa varchar(128) not null, '+
                  'nazwa_fiskalna varchar(16) null, '+
                  'nr_fvz varchar(32) not null, '+
                  'id_jm integer not null, '+
                  'id_typ text not null, '+
                  'ilosc float not null, '+
                  'cena float null, '+
                  'marza float not null, '+
                  'sn varchar(128) null, '+
                  'created_by integer null, '+
                  'modified_by integer null, '+
                  'created_date date null, '+    // 1999-01-08
                  'modified_date date null, '+   // 1999-01-08
                  'PRIMARY KEY(id), '+
                  'CONSTRAINT id_jm FOREIGN KEY (id_jm) REFERENCES kartoteki.jednostki_miar (id) ON UPDATE NO ACTION ON DELETE NO ACTION, '+
                  'CONSTRAINT id_typ FOREIGN KEY (id_typ) REFERENCES kartoteki.typ_towarow (nazwa_typu) ON UPDATE NO ACTION ON DELETE NO ACTION);';

i teraz tworze zapytania budujace baze

    SQL_CommandRun(DB_AdoCommand, '', PChar('CREATE TABLE kartoteki.jednostki_miar' +TabelaJednostekMiar));
    SQL_CommandRun(DB_AdoCommand, '', PChar('CREATE TABLE kartoteki.table_typ_towarow' +TabelaTypowTowarow));
    SQL_CommandRun(DB_AdoCommand, '', PChar('CREATE TABLE kartoteki.table_towary' +TabelaTowarow));

dalej funkcja SQL_CommandRun:

function SQL_CommandRun(DB_AdoCommand : TADOCommand; baza, zapytanie : String) : Boolean;
begin
  try
    if baza <> '' then
    begin
      SetDB_box.DB_Connect := DB_Connect;
      SetDB_box.plik := path_dir +dir_prefs +'\' +file_prefs;
      SetDB_box.plik_pack := path_dir +LibPack;
    end;
    SQL_Command(DB_AdoCommand, baza, zapytanie, SetDB_box);
  except; end;
end;

i dalej zapytanie umieszczone w bibliotece DLL:

procedure SQL_Command(DB_AdoCommand : TADOCommand; baza, zapytanie : String; SetDB_box : TSetDB); external LibConnect;

a oto i sama biblioteka:

procedureSQL_Command(DB_AdoCommand : TADOCommand; baza, zapytanie : String; SetDB_box : TSetDB);
begin
  if baza <> '' then SetDB(SetDB_box.DB_Connect, SetDB_box.plik, SetDB_box.plik_pack, baza);  // aktywuje baze
  DB_AdoCommand.CommandType := cmdText;
  DB_AdoCommand.CommandText := zapytanie;
  try
    DB_AdoCommand.Execute;
  except
  end;
end;


Trochę to pogmatfane ale działa dobrze. Użyłem try except na wypadek wszelkich blędów powodujących wywołaniami bezpośrednio z biblioteki.
mój problem rozwiązałem robiac w ten sposób:

begin
  SQL_CommandRun(DB_AdoCommand, db_rksystem +InfoDB.rok, 'DELETE FROM kartoteki.jednostki_miar' WHERE id='''+IntToStr(id)+''';');
  if SprawdzMozliwoscZapisu('kartoteki', 'jednostki_miar', 'id='''+IntToStr(id)+'''') > 0 then
  begin
    Komunikat('Jednostka miary jest przypisana do towaru, i nie ma możliwości usunięcia jej.');
    Exit;
  end;
end;]]></content>
			<author>
				<name><![CDATA[rafko]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=8</uri>
			</author>
			<updated>2008-02-07T20:58:05Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=5#p5</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Wykrycie referencji]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=3#p3"/>
			<content type="html"><![CDATA[[quote=rafko]Powiedzmy, że chcę usuną wartość "a" z tabeli A i chcę sprawdzić czy ta warotść jest używana w tabeli B.[/quote]
Z tego co wiem to jeśli wartość "a" była by używana w tabeli B czyli była by np. kluczem obcym (powiązania były by kaskadowe między tymi tabelami A była by nadrzędną np.)w tej tabeli przy próbie usunięcia jej tylko z A, powinien program wygenerować jakiś wyjątek który możesz przechwycić przy pomocy "Try", nie wiem jakie masz zdefiniowane zależności w tabelach, nie podałeś czy masz w ogóle jakieś zdefiniowane, przedstaw jakieś konkrety to postaram Ci się pomóc gdyż sam jestem teraz na etapie programowania w Delphi przy użyciu ado.Wydaje mi się że musisz tu zdefiniować konkretne zależności między tabelami.]]></content>
			<author>
				<name><![CDATA[Rady]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=6</uri>
			</author>
			<updated>2008-02-07T20:08:24Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=3#p3</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Wykrycie referencji]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=2#p2"/>
			<content type="html"><![CDATA[Witam
Mam problem z wykryciem referencji z tabeli A do tabeli B. Już tłumaczę:
Powiedzmy, że chcę usuną wartość "a" z tabeli A i chcę sprawdzić czy ta warotść jest używana w tabeli B.

W moim programie używam adoconnection (dynamicznie budowane) i w zapytaniu do bazy nie zwraca mi żadnych wyników błędnych lub niemożliwych do wykonania, stąd właśnie moje pytanie. Być może istnieje zapytanie, które zwróci mi komunikat, że taka wartość "a" jest użyta w tabeli B.]]></content>
			<author>
				<name><![CDATA[rafko]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=8</uri>
			</author>
			<updated>2008-02-07T19:51:41Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=2#p2</id>
		</entry>
</feed>
