Obsługa pola null pobranego z bazy MSSQL

Odpowiedz Nowy wątek
2014-01-30 09:46
0

Witajcie,
mój program pobiera z bazy danych MSSQL rekordy towarów (zapytanie łączy ze sobą 3 tabele: Towary, Stan_towarów, Dostawcy_towarów).
Wynik zapytania często pobiera dla niektórych towarów z tabeli Stan_towarów wartość null, która mówi ze nie ma towaru ze stanem.
poniżej zapytanie:

SELECT t.id_towaru_int, t.NAZWA_TOWARU, t.ilosc_jedn_zakupu, t.min_stan, s.ilosc_dostepna, e.symbol_towaru 
FROM  TOWARY t left join stan_magazynowy s on(t.id_towaru_int=s.id_towaru_int) left join dostawcy_towarow e on (t.id_towaru_int=e.id_towaru_int) 
where e.id_kth_alt like ''%D2F64E93AC78%'' and t.id_typu_towaru=''{793DFF79-61DF-43B0-86B2-D17D93C42D78}'' and t.czy_blokada_zakupu=''N'' and t.czy_ewidencjonowac=''T''

obsługa zapytania w delphi:

 while not SQL.Eof do
  begin
    ListItem := ListView.Items.Add;
    ListItem.Caption := (SQL.FieldValues['symbol_towaru']);
    ListItem.SubItems.Add(SQL.FieldValues['NAZWA_TOWARU']);
    ListItem.SubItems.Add(SQL.FieldValues['ilosc_jedn_zakupu']);
    **ListItem.SubItems.Add(SQL.FieldValues['ilosc_dostepna']);**
    ListItem.SubItems.Add(SQL.FieldValues['min_stan']);
                  end;
    SQL.Next;
  end;
  SQL.Close;

i niestety przy dodawaniu SubItemsa z polem ilosc_dostepna jesli wartość jest null wywala błąd:
c87d897068.png

czy ktoś wie jak obsłużyć tą wartość null?

Pozostało 580 znaków

2014-01-30 09:51
0

a czemu jest

end;

przed SQL.Next;


 ?

Pozostało 580 znaków

2014-01-30 09:53
0

Najprościej pobrać SQL.FieldValues['ilosc_dostepna'] do jakiejś zmiennej np Variant i sprawdzić czy nie jest null'em, można by też zamieniać na jakiś tekst pole ilosc_dostepna przy wywoływaniu zapytania ale to z kolei mogło by zabić db przy dużych porcjach danych.

Pozostało 580 znaków

2014-01-30 10:05

Konwertuj funkcją VarToStr czyli:

ListItem.SubItems.Add(VarToStr(SQL.FieldValues['ilosc_dostepna']));

Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
edytowany 1x, ostatnio: kAzek, 2014-01-30 10:06
VarToStr nie zwróci przypadkiem napisu null? - hzmzp 2014-01-30 10:07
Zwróci pusty string a chyba o to mu chodzi? - kAzek 2014-01-30 10:08

Pozostało 580 znaków

2014-01-30 10:11
0

dzięki kolego kAzek :) udało się

Pozostało 580 znaków

2014-01-30 10:13
0

Albo jak chcesz mieć 0 zamiast pustego napisu to prosta funkcja:

function VariantTo0Str(AValue: Variant): string;
begin
  result:= '0';
  if AValue = null then exit;
    result:= AValue;
end;

Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.

Pozostało 580 znaków

2014-01-30 10:17
0

A z zamiana na wartość 0 to już sobie poradzę, jeszcze raz dzięki ;)

Pozostało 580 znaków

2014-01-30 12:40
1

a nie lepiej tak :

sql.fieldbyname('ilosc_dostepna').asfloat ;

lub tak 

sql.fieldbyname('ilosc_dostepna').asinteger ;
miałem proponować ale byłeś szybszy - abrakadaber 2014-01-30 12:58

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