Автор | Сообщение |
|
| постоянный участник
|
Пост 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 |
|
|
|
|
Ответов - 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. (Правда, не в харборе...) Хотя, знаю человека, у которого в паспорте в самом деле нет отчества.
|
|
|
|
| постоянный участник
|
Пост N: 184
Зарегистрирован: 13.10.05
|
|
Отправлено: 01.03.11 05:30. Заголовок: QUERY->Ot форми..
QUERY->Ot формирует данные из символьной строки. Это отчества из таблицы первоисточника. У некоторых людей его нет. Если поле источника пустое, то QUERY->Ot заполнен не читаемыми символами. И длина равна 20 символам, так же как и у источника.
|
|
|
|
| |
Пост 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 )? Пока, вроде, отчеств с цифрами не было.
|
|
|
|
| |
Пост 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.
|
|
|
|
| Администратор
|
Пост N: 1840
Зарегистрирован: 23.05.05
|
|
Отправлено: 01.03.11 20:35. Заголовок: Ну если после выдачи..
Ну а если после выдачи select выдать обычный browse(), исключительно для того, чтобы удостовериться, что строки с пустым отчеством попали в запрос, а не почиканы фильтром where ? Что видно ? И что значит нечитаемые символы ? Что если разобрать побайтно эти тайные письмена 20 символов ?
|
|
|
|
| постоянный участник
|
Пост N: 185
Зарегистрирован: 13.10.05
|
|
Отправлено: 02.03.11 10:00. Заголовок: Попробовал, в browse..
Попробовал, в browse на пустых полях видны значки - слабо подсвеченнык квадратики. Вывел в текст таблицу. Там где отчество отсутвует, в текстовом файле коды chr(0).Количество их 20 - это как раз длина исходного поля, которое обрабатывалось запросом
|
|
|
|
| Администратор
|
Пост N: 1841
Зарегистрирован: 23.05.05
|
|
Отправлено: 02.03.11 10:17. Заголовок: Так может эти Chr(0)..
Так может эти Chr(0) и в исходном дбф-файле сидят ?
|
|
|
|
| постоянный участник
|
Пост N: 186
Зарегистрирован: 13.10.05
|
|
Отправлено: 02.03.11 10:49. Заголовок: В исходном файле по..
В исходном файле поле пустое - заполнено символами chr(32) . Фильтр Emty(Ot) нормально работает - показывет 2 записи. В конечном файле, с данными из запроса - фильтр пустые записи не показывает, по видимому потому что они не пустые. Хотя визуально там ничего нет.
|
|
|
|
| постоянный участник
|
Пост N: 187
Зарегистрирован: 13.10.05
|
|
Отправлено: 02.03.11 10:57. Заголовок: Поставил проверку пе..
Поставил проверку перд заполнением цитата: | if Left(QUERY->Ot,1) <> chr(0) Repl NAME3 with QUERY->Ot endif |
| Теперь выводится все правильно. Но это костыль
|
|
|
|
| Администратор
|
Пост N: 1842
Зарегистрирован: 23.05.05
|
|
Отправлено: 02.03.11 14:04. Заголовок: Vlad04 пишет: Тепер..
Vlad04 пишет: цитата: | Теперь выводится все правильно. Но это костыль |
| Так это вопрос не харбора, а Ads. Почему там так работает select - спрашивать надо у sybase
|
|
|
|
| Администратор
|
Пост N: 1843
Зарегистрирован: 23.05.05
|
|
Отправлено: 02.03.11 14:22. Заголовок: Нет, оказывается и r..
Нет, оказывается и rddads виноват. AdsGetField наверное возвращает значение поля длиной 0 А rddads в xHarbour (adsGetValue) формирует результат размерностью длина поля. Вот и получаются нули в поле В Harbour поведение другое - символьное поле получается той размерности, что и возвращает Ads
|
|
|
|
|
| постоянный участник
|
Пост N: 188
Зарегистрирован: 13.10.05
|
|
Отправлено: 02.03.11 14:23. Заголовок: Да, Ads. У меня 7 в..
Да, Ads. У меня 7 версия стоит, надо с 9 проверить
|
|
|
|
| |
Пост N: 2059
Зарегистрирован: 17.05.05
|
|
Отправлено: 02.03.11 15:14. Заголовок: Vlad04 пишет: надо ..
Vlad04 пишет: Да уже и 10 есть. Использую ее , полет нормальный.
|
|
|
|
| |
Пост N: 24
Зарегистрирован: 19.08.10
|
|
Отправлено: 02.03.11 15:27. Заголовок: Помнится, было как-т..
Помнится, было как-то давно такое: прямой доступ к полю давал правильные данные, а вот через SQL-запрос выдавал чушь. Это в C через API, то есть может rdd и не при чем?. Если память не изменяет, в хелпе к ADS что-то было про проблемы SQL и пустых значений в запросе. Попробуй через AdsGetField получить значение отчества и через запрос. Если будет разница - глючит SQL ADS.
|
|
|
|
| |
Пост N: 7
Зарегистрирован: 20.02.11
|
|
Отправлено: 02.03.11 17:14. Заголовок: Скорее всего все правильно ...
Скорее всего все правильно ... в ADS SQL есть значение NULL в xBase синтаксесе его не отловить. Попробуйте подменить значение NILL на пустую строку в самом запросе используя ISNULL() и IF()
|
|
|
|
| постоянный участник
|
Пост N: 189
Зарегистрирован: 13.10.05
|
|
Отправлено: 02.03.11 18:40. Заголовок: Пересобрал lib с ..
Пересобрал lib с 9 версией, заменил ansi.chr и extend.chr и все СТАЛО НОРМАЛЬНО!! Собака здесь была зарыта. Ух!!!
|
|
|
|
| |
Пост N: 25
Зарегистрирован: 19.08.10
|
|
Отправлено: 02.03.11 19:43. Заголовок: Поздравляю! Недели н..
Поздравляю! Недели не прошло, а проблема решилась. А ведь можно было на "костылях ходить"... Теперь следующий ход: пересобрать с версией 10.1
|
|
|
|