On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение
постоянный участник


Пост N: 183
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 28.02.11 19:48. Заголовок: Что в пустом поле таблицы записано?


Поля таблицы заполняю данными из запроса ADS.При заполнении таблицы веду некоторую обработку. Так если поле запроса QUERY->Ot пустое, то должен изменить значение друго поля. Но это событие QUERY->Ot ни как не ловится. Ни empty(), ни len(Alltrim(QUERY->Ot)) = 0 и т.д.
В итоговой таблице если вы попробуете отобрать записи у которых Empty(Name3) , то такие записи оказывается отсутствуют. Визуально есть пустые поля.

 цитата:

//**************** Это в головном файле
REQUEST ADS ; rddRegister("ADS", 1 )
rddsetdefault("ADS" ); SET SERVER LOCAL
AdsSetFileType(ADS_CDX)
AdsConnect(Par1)
//ОЕМ
AdsSetCharType( 1, .T. )

REQUEST DBFCDX , DBFFPT

REQUEST HB_CODEPAGE_RU866
hb_SetCodepage("RU866")
//*******************

......

Proc Vigrus()
......

nSele:=Select() ; Select (nSele+1)

AdsCreateSQLStatement('QUERY', 2)

sQlStr:='SELECT DISTINCT w.n_otdel,k.kucha,k.Nomk,k.fam,k.im,k.ot,k.pol,k.birth_date,';
+ 'k.DOC_TYPE,k.DOC_SER,k.DOC_NUM,k.NO_POLIS,';
+ 'k.POLIS_SER,k.POLIS_NUM,k.NASP_CODE2,W.S_TYPE ';
+ ' FROM '+Par2+'ARC\Karta kT, ';
+ Par2+'ARC\SWIST W,';
+ Par2+'KLIENT K ';
+ ' where ((kT.Unicum = K.Unicum) and (kT.N_TALON = W.N_TALON)';
+' AND (K.N_TARIF =0 ) AND (kT.Oplata =2) AND ';
+ IIF(i=1,' (W.S_TYPE ='+chr(39)+'R'+chr(39)+') ',' (W.S_TYPE <> '+chr(39)+'R'+chr(39)+') ');
+ ') ORDER BY 4'
AdsPrepareSQL(sQlStr)
AdsExecuteSQL(sQlStr)
nRecCount:=RecCount()

if nRecCount > 0
SeLect QUERY
Go Top
DO While !EOF()
Select SPM_CPM
APPEND Blank
Repl NOMPOD with Str(QUERY->N_otdel,2)
if Val(QUERY->kucha) >0
Repl AREA_CODE with QUERY->kucha
endif

Repl NOMK with ALLTRIM(Str(QUERY->Nomk))
Repl NAME1 with QUERY->Fam
Repl NAME2 with QUERY->Im
Repl NAME3 with QUERY->Ot
Repl SEX with Str(QUERY->Pol,1)
Repl BIRTH_DATE with QUERY->BIRTH_DATE
Repl DOC_TYPE with QUERY->DOC_TYPE
Repl DOC_SER with QUERY->DOC_SER
Repl DOC_NUM with QUERY->DOC_NUM

if Left(QUERY->NO_POLIS,1) = '-'
Repl SER_NUM with Rtrim(QUERY->POLIS_SER) +' '+ALLTRIM(Str(Val(QUERY->POLIS_Num)))
if Empty(NAME3) // ни как не ловится
Repl SPM_CPM->NO_POLIS with '4'
endif
endif
Repl NASP_CODE with QUERY->NASP_CODE2

SeLect QUERY
skip
enddo

Close SPM_CPM
Close QUERY

Return





Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 17 [только новые]





Пост N: 15
Зарегистрирован: 19.08.10
ссылка на сообщение  Отправлено: 28.02.11 21:31. Заголовок: А QUERY->Ot вооб..


А QUERY->Ot вообще-то пустое?
В смысле, Valtype(QUERY->Ot) что выдаст?

if Left(QUERY->NO_POLIS,1) = '-'
Repl SER_NUM with Rtrim(QUERY->POLIS_SER) +' '+ALLTRIM(Str(Val(QUERY->POLIS_Num)))
if Empty(NAME3) // ни как не ловится
Repl SPM_CPM->NO_POLIS with '4'
endif
endif


Либо первый IF в условии выдает .F., и второй просто не проверяется?

Помню, долго однажды курил по поводу ( 0 / 1 == 0 ) -> .F. (Правда, не в харборе...)

Хотя, знаю человека, у которого в паспорте в самом деле нет отчества.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 184
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 01.03.11 05:30. Заголовок: QUERY->Ot форми..


QUERY->Ot формирует данные из символьной строки. Это отчества из таблицы первоисточника. У некоторых людей его нет.
Если поле источника пустое, то QUERY->Ot заполнен не читаемыми символами. И длина равна 20 символам, так же как и у источника.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 20
Зарегистрирован: 19.08.10
ссылка на сообщение  Отправлено: 01.03.11 11:30. Заголовок: Vlad04 пишет: QUERY..


Vlad04 пишет:

 цитата:
QUERY->Ot заполнен не читаемыми символами


Интересно, почему нечитаемыми заполняется?

? empty ( " " ) // .T.
? empty ( chr (13) ) // .T. вот перевод строки ловится
? empty ( chr ( 7 ) ) // .F. а бип - нет

Соответственно если QUERY->Ot содержит невидимые символы с кодами 0...31 ( исключая 0, 9, 10, 13, 26 ), визуально строка пустая, но и не поймается на пустоту.

Может, попробовать IsAlpha(QUERY->Ot )? Пока, вроде, отчеств с цифрами не было.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 21
Зарегистрирован: 19.08.10
ссылка на сообщение  Отправлено: 01.03.11 11:49. Заголовок: Проверил: Request H..


Проверил:

Request HB_CODEPAGE_RU1251
hb_setcodepage ( 'RU1251' )

IsAlpha ( " " ) // .F.
IsAlpha ( chr ( 7 ) ) // .F.
IsAlpha ( "Федорович" ) // .T.
IsAlpha ( "1Федорович" ) // .F.


Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 1840
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 01.03.11 20:35. Заголовок: Ну если после выдачи..


Ну а если после выдачи select выдать обычный browse(), исключительно для того, чтобы удостовериться, что строки с пустым отчеством попали в запрос, а не почиканы фильтром where ? Что видно ?
И что значит нечитаемые символы ? Что если разобрать побайтно эти тайные письмена 20 символов ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 185
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 02.03.11 10:00. Заголовок: Попробовал, в browse..


Попробовал, в browse на пустых полях видны значки - слабо подсвеченнык квадратики. Вывел в текст таблицу. Там где отчество отсутвует, в текстовом файле коды chr(0).Количество их 20 - это как раз длина исходного поля, которое обрабатывалось запросом

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 1841
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 02.03.11 10:17. Заголовок: Так может эти Chr(0)..


Так может эти Chr(0) и в исходном дбф-файле сидят ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 186
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 02.03.11 10:49. Заголовок: В исходном файле по..


В исходном файле поле пустое - заполнено символами chr(32) . Фильтр Emty(Ot) нормально работает - показывет 2 записи. В конечном файле, с данными из запроса - фильтр пустые записи не показывает, по видимому потому что они не пустые. Хотя визуально там ничего нет.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 187
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 02.03.11 10:57. Заголовок: Поставил проверку пе..


Поставил проверку перд заполнением

 цитата:

if Left(QUERY->Ot,1) <> chr(0)
Repl NAME3 with QUERY->Ot
endif



Теперь выводится все правильно. Но это костыль

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 1842
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 02.03.11 14:04. Заголовок: Vlad04 пишет: Тепер..


Vlad04 пишет:

 цитата:
Теперь выводится все правильно. Но это костыль



Так это вопрос не харбора, а Ads. Почему там так работает select - спрашивать надо у sybase

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 1843
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 02.03.11 14:22. Заголовок: Нет, оказывается и r..


Нет, оказывается и rddads виноват. AdsGetField наверное возвращает значение поля длиной 0
А rddads в xHarbour (adsGetValue) формирует результат размерностью длина поля. Вот и получаются нули в поле
В Harbour поведение другое - символьное поле получается той размерности, что и возвращает Ads

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 188
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 02.03.11 14:23. Заголовок: Да, Ads. У меня 7 в..


Да, Ads. У меня 7 версия стоит, надо с 9 проверить

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 2059
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 02.03.11 15:14. Заголовок: Vlad04 пишет: надо ..


Vlad04 пишет:

 цитата:
надо с 9 проверить


Да уже и 10 есть. Использую ее , полет нормальный.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 24
Зарегистрирован: 19.08.10
ссылка на сообщение  Отправлено: 02.03.11 15:27. Заголовок: Помнится, было как-т..


Помнится, было как-то давно такое:
прямой доступ к полю давал правильные данные, а вот через SQL-запрос выдавал чушь. Это в C через API, то есть может rdd и не при чем?.
Если память не изменяет, в хелпе к ADS что-то было про проблемы SQL и пустых значений в запросе.

Попробуй через AdsGetField получить значение отчества и через запрос.
Если будет разница - глючит SQL ADS.



Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 02.03.11 17:14. Заголовок: Скорее всего все правильно ...


Скорее всего все правильно ... в ADS SQL есть значение NULL в xBase синтаксесе его не отловить.
Попробуйте подменить значение NILL на пустую строку в самом запросе используя ISNULL() и IF()

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 189
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 02.03.11 18:40. Заголовок: Пересобрал lib с ..


Пересобрал lib с 9 версией, заменил ansi.chr и extend.chr и все СТАЛО НОРМАЛЬНО!!
Собака здесь была зарыта.
Ух!!!

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 25
Зарегистрирован: 19.08.10
ссылка на сообщение  Отправлено: 02.03.11 19:43. Заголовок: Поздравляю! Недели н..


Поздравляю! Недели не прошло, а проблема решилась.
А ведь можно было на "костылях ходить"...
Теперь следующий ход: пересобрать с версией 10.1

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 1
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет