Wpis z mikrobloga

#pomocy #bazydanych #crystalreport #informatyka #komputery

Mirki czy jest tu ktos smigajacy niczym puma po Crystal Reports 2008 tudziez inny rocznik? Mam maly problem, jeden z tych co to powinno dzialac a nie dziala. Na bank cos zle robie. Mam baze danych Access do ktorej jestem podlaczony przez Crystala, jest tam tabela SODetail a w niej pole CustomerLine, ktore jest typu string[5]. W pole to wpisuje ilosc wykonanych produktow. No wiec jest formula To Do, ktora pokazuje ile jest jeszcze do zrobienia i wyglada tak

{SODetail.QuantityOrdered} - ToNumber({SODetail.CustomerLine})

Czyli od zamowionej ilosci odejmowana jest ilosc wykonana. Bez funkcji ToNumber wyskakuje oczywiscie blad bo nie moze odjac stringa od wartosci numerycznej. No i problem polega na tym, ze jak wpisze cos w to pole (CustomerLine) to dziala perfekcyjnie i pokazuje ile jest jeszcze do zrobienia, lacznie z "0" kiedy wartosci sa te same, tyle tylko ze kiedy nic nie jest wpisane (w CustomerLine) to niby traktuje to jak wartosc numeryczna (nie wyskakuje blad przy odejmowaniu) ale wynikiem jest pustka. W miejscu X na ponizszym obrazku powinna byc wartosc z Quantity.Ordered. Moim celem jest wyeliminowanie linii z To Do = 0, jednakze zawsze kiedy to robie znikaja takze linie ktore sa cale do zrobienia i maja ta pustke.

http://imghost.nottin.net/pics/434d8f129ba33f2a23bfbf165dd9c716.jpg

Spodziewalem sie, ze pusty string zostanie przekonwertowany do "0" czyli To Do powinno pokazywac Quantity.Ordered, ale nie pokazuje. Probowalem to omijac na rozne sposoby, ale ilekroc dotykam sie pola CustomerLine, ktore jest puste to wynikiem roznych formul jest pustka. Np. kiedy wpisze CustomerLine=10 a OrderQuantity tez jest 10 no to pokazuje ladnie zero do zrobienia. W SelectExpert record chcialem stworzyc warunek eliminujacy wykonane linie (skonczone produkty) wiec zrobilem po prostu wypisywanie wszystkich z To Do > 0 no i wtedy ta pustka z To Do traktowana jest jak zero i dana linia znika takze. Jednak mimo traktowania tego jako numer to zadne dzialania na tym nie dzialaja. Wymyslilem wiec ze omine To Do i zrobie warunek zeby pokazywane byly tylko te linie w ktorych wartosc rekordu Quantity.Ordered <> Customer.Line, no bo jak bedzie rowna to zrobione. I tu znowu to samo, dziala tylko jak cos jest wpisane, tzn. wynikiem porownania Quantity.Ordered (tu zawsze jest jakas liczba) do pustego pola nie jest false tylko true i linia znika. Caly czas oczywiscie konwertuje tego stringa do liczby. Probowalem roznych sztuczek typu konwersja do innego typu, czy sprawdzanie tego pola czy jest puste zliczajac ilosc znakow w nim wystepujacych, ale zawsze wychodzi to samo, rekordy z pustym Customer.Line po prostu zachowuja sie jak chca. Jak zrobie na przyklad tak:

{SODetail.CustomerLine} <> ToText({SODetail.QuantityOrdered})

albo tak

ToNumber({SODetail.CustomerLine}) <> {SODetail.QuantityOrdered}

to znikaja rekordy z pustym customerline a reszta zostaje, tam gdzie To Do jest 0 lub wiecej bo wtedy CustomerLine jest wypelniona. Jakim cudem porownanie tych dwoch pol wychodzi na odwrot, przeciez nie ma takiej opcji zeby pusty string czy number mial sie rownac czemukolwiek gdzie jest jakas wartosc?

Mam nadzieje ze wytlumaczylem w miare logicznie.. Szlag mnie trafi zaraz ...
  • 6
@zigiscrew: Spróbuj

Nz(ToNumber(..))
zamiast samego

ToNumber()
? Albo

IIF(ISNULL(ToNumber({SODetail.CustomerLine}),0,ToNumber({SODetail.CustomerLine}))
(chociaż tylko zgaduję, bo to trochę rzeźba, kto wymyślił by wartości numeryczne trzymać w stringu?!)
@list86: dzieki, zaraz sprobuje, w sumie nie powinno byc z tym takiego problemu po tym konwertowaniu, w koncu po to to jest, dlatego nie rozumiem za bardzo czemu tak sie dzieje, firma generalnie strasznie ma spieprzony system raportowania i planowania i proboje wykorzystac nieuzywane pola w aplikacji pod windowsa zeby potem na ich podstawie moc generowac raport, bo to co jest wpsiywane i trzymane w bazie nie odpowiada rzeczywistosci. Normalnie wykorzystalbym
@list86: niestety, z tym Nz to nie mam takiej funkcji, a to drugie tez nie dziala, ale jestem blisko, cos sie ruszylo, dzieki Tobie poszukalem innej funkcji i znalazlem NumericText zwracajacy boolean

If NumericText ({SODetail.CustomerLine}) Then

{SODetail.QuantityOrdered} - ToNumber({SODetail.CustomerLine})

Else

{SODetail.QuantityOrdered}

teraz tam gdzie byly puste miejsca To Do (ten X czerwony) pokazuje Quantity Ordered, wykorzystam to juz jakos, dzieki wielkie za natchnienie :)