Форум » [x]Harbour » Что в пустом поле таблицы записано? » Ответить

Что в пустом поле таблицы записано?

Vlad04: Поля таблицы заполняю данными из запроса ADS.При заполнении таблицы веду некоторую обработку. Так если поле запроса QUERY->Ot пустое, то должен изменить значение друго поля. Но это событие QUERY->Ot ни как не ловится. Ни empty(), ни len(Alltrim(QUERY->Ot)) = 0 и т.д. В итоговой таблице если вы попробуете отобрать записи у которых Empty(Name3) , то такие записи оказывается отсутствуют. Визуально есть пустые поля. [quote] //**************** Это в головном файле 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 [/quote]

Ответов - 17

Chikanuk: А 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. (Правда, не в харборе...) Хотя, знаю человека, у которого в паспорте в самом деле нет отчества.

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

Chikanuk: 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 )? Пока, вроде, отчеств с цифрами не было.


Chikanuk: Проверил: Request HB_CODEPAGE_RU1251 hb_setcodepage ( 'RU1251' ) IsAlpha ( " " ) // .F. IsAlpha ( chr ( 7 ) ) // .F. IsAlpha ( "Федорович" ) // .T. IsAlpha ( "1Федорович" ) // .F.

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

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

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

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

Vlad04: Поставил проверку перд заполнением if Left(QUERY->Ot,1) <> chr(0) Repl NAME3 with QUERY->Ot endif Теперь выводится все правильно. Но это костыль

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

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

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

Dima: Vlad04 пишет: надо с 9 проверить Да уже и 10 есть. Использую ее , полет нормальный.

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

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

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

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



полная версия страницы