Skocz do zawartości

Hurtowa dodanie cechy do transakcji po SQL

Polecane posty

Hej.

Potrzebuję dodać hurtowo cechę do transakcji, jednak mam z tym kłopot. Pozornie wygląda to tak, że wystarczy do tabeli tr_Property dodać id transakcji i id cechy ze słownika. Jednak nie do końca rozumiem, na jakiej zasadzie nadawany jest id tej tabeli, czyli tp_Id. Dodanie go na zasadzie poprzedni id + 1 powoduje informację w Sello o problemach z integralnością w momencie kiedy chcę dodać kolejną cechę na transakcji która została wcześniej dodana po SQL. Jakieś pomysły jak podejść do tego ID?

Link to postu

Zmiany zbiorcze w Sello nie załatwią sprawy?

769658907_Zmianyzbiorcze.png.9a5f8f2c4b5fa74ffc6a390630397682.png

Jeżeli chodzi o tp_Id to jest to PRIMARY KEY i jego się nie ustala podczas dodawania bo on się zwiększa sam automatycznie.

Powinno to wyglądać w ten sposób: (chociaż polecenia typu INSERT na bazie Sello nie są zalecane)

INSERT INTO tr_Property (tp_TransId, tp_PropId) VALUES (<id_transakcji>, <id_cechy>)

 

Link to postu

Zbiorcze nie załatwiają sprawy, bo zmiany są na podstawie stanów z Subiekta. Zapytanie sprawdza stany, i tylko dla tych gdzie jest > 0 ma dodać cechę.

Twój insert by zadziałał gdyby na kolumnie tp_Id oprócz PK był autoincrement, zapytanie wywala błąd:

Cannot insert the value NULL into column 'tp_Id', table 'Sello.dbo.tr_Property'; column does not allow nulls. INSERT fails.

Czyli kolumna nie zwiększa się automagicznie. Z drugiej strony Sello na jakiejś podstawie zwiększa Id, i ogólnie ta kolumna działa jakby faktycznie działała na niej autoinkrementacja.

Link to postu
11 minut temu, Piotr Sięga napisał:

Zbiorcze nie załatwiają sprawy, bo zmiany są na podstawie stanów z Subiekta. Zapytanie sprawdza stany, i tylko dla tych gdzie jest > 0 ma dodać cechę.

To ma być systematycznie wykonywana operacja czy tylko jednorazowo? W Sello można wysortować aukcje po stanie z Subiekta i zaznaczyć zmiany tylko dla tych ze stanem powyżej zera.

14 minut temu, Piotr Sięga napisał:

wój insert by zadziałał gdyby na kolumnie tp_Id oprócz PK był autoincrement, zapytanie wywala błąd:

Trochę dziwne, że nie ma autoincrement. Można jeszcze spróbować w taki sposób (nie testowane):

INSERT INTO tr_Property (tp_Id, tp_TransId, tp_PropId) VALUES ((SELECT TOP(1) tp_Id + 1 from tr_Property), <id_transakcji>, <id_cechy>)
Link to postu
Cytat

To ma być systematycznie wykonywana operacja czy tylko jednorazowo? W Sello można wysortować aukcje po stanie z Subiekta i zaznaczyć zmiany tylko dla tych ze stanem powyżej zera.

Systematycznie wykonywane.

Cytat

Trochę dziwne, że nie ma autoincrement. Można jeszcze spróbować w taki sposób (nie testowane):

Już przerobione, tak jak wcześniej pisałem, właśnie w tej sytuacji Sello wywala problemy z integralnością. Co ciekawe, nadanie cechy przez Sello ustawia Id np.na 11261, usunięcie cechy usuwa również to Id, więc ostatnie używane to 11260, ale przypisanie kolejnej cechy przez Sello ustawia Id nie na ostatnie w tabeli + 1 czyli znów na 11261, ale na 11262, czyli dokładnie tak jakby na kolumnie było AI.

Link to postu

identyfikatory dla tabel należy nadawać za pomocą procedury składowanej spIdentyfikator. Poniżej przykładowy kod jak uzyskać @id dla nowego wiersza.

declare @id int
exec spIdentyfikator 'tr_property', 1, @id output

select @id

Dzięki temu nie będzie problemów ze spójnością danych. Jeśli potrzeba więcej identyfikatorów to zamiast 1 można wpisać większą liczbę.

 

14 minut temu, Piotr Sięga napisał:

czyli dokładnie tak jakby na kolumnie było AI.

Bo jest, tylko "softwareowe" o nazwie tabeli ins_Ident.

 

  • Lubię to 1
Link to postu
  • 2 lata później...

Wracając do tematu stworzyłem przykładowe zapytanie SQL, które dodaje do danej transakcji odpowiednią cechę

DECLARE @trans_id INT = 3529752 -- identyfikator transakcji
IF EXISTS ( SELECT 1 FROM tr__Transaction WHERE tr_Id = @trans_id ) -- jeżeli taka transakcja istnieje to...
BEGIN
	DECLARE @prop_id INT = (SELECT tp_Id FROM sl_TransProperty WHERE tp_Name = 'ObrobionaBL') -- sprawdzamy identyfikator cechy wg jej nazy
	IF EXISTS (SELECT @prop_id) -- jeżeli taka cecha istnieje to..
	BEGIN
		IF NOT EXISTS ( SELECT tp_Id FROM tr_Property WHERE tp_TransId = @trans_id AND tp_PropId = @prop_id ) -- upewniamy się, że ta transakcja nie ma już nadanej takiej cechy..
		BEGIN
			DECLARE @last_tpid INT
			EXEC spIdentyfikator 'tr_Property',1,@last_tpid OUTPUT -- wczytujemy wolny identyfikator tabeli tr_Property i dopisujemy go do liczników w tabeli ins_Ident
			INSERT INTO "tr_Property" ("tp_Id","tp_TransId","tp_PropId") VALUES (@last_tpid,@trans_id,@prop_id) -- dodajemy cechę do transakcji
		END
	END
END

 

Edytowane przez Mamut Maniek
Link to postu
  • 3 miesiące temu...
W dniu 9.03.2020 o 10:05, Bartosz Rosa napisał:

identyfikatory dla tabel należy nadawać za pomocą procedury składowanej spIdentyfikator. Poniżej przykładowy kod jak uzyskać @id dla nowego wiersza.

declare @id int
exec spIdentyfikator 'tr_property', 1, @id output

select @id

Dzięki temu nie będzie problemów ze spójnością danych. Jeśli potrzeba więcej identyfikatorów to zamiast 1 można wpisać większą liczbę.

 

Bo jest, tylko "softwareowe" o nazwie tabeli ins_Ident.

 

o co chodzi z parametrem @liczba w procedurze składowanej spIdentyfikator?

image.png.6ac8bf1c8522a3c9d5fa149b698f08bf.png

Próbowałem podać tam inną wartość niż 1 (np. 3) ale zmienna @id jest typu int i tam trzyma tylko jedną wartość, o co chodzi?

Link to postu

Jest to liczba identyfikatorów do rezerwacji, np jeśli potrzebujesz 17 identyfikatorów, bo wiesz że tyle obiektów będziesz do bazy danych dodawał, to można wywołać spIdentyfikator raz podając 17 jako liczba. Licznik identyfikatorów zostanie przesunięty o 17 do przodu.

 

Czyli mówiąc pseudokodem, zamiast:

 

for(i = 0 to 16)
{
  id = spIdentyfikator('nazwa',1)
  obiekt.id = id
  ...
}

robisz
 

id = spIdentyfikator('nazwa',17)
for(i = 0 to 16)
{
  obiekt.id = id+i
  ...
}

 

  • Dziękuję 1
Link to postu

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.
Uwaga: Twój wpis zanim będzie widoczny, będzie wymagał zatwierdzenia moderatora.

Użytkownik forum
Odpowiedz...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

×
×
  • Dodaj nową pozycję...