Setnull()

ODBC

Модератор: Andrew™

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Setnull()

Сообщение ru_alex »

Всем привет!

Народ, кто как решает вопрос с полями в SQL, которые Null?
В любой, более менее реляционной базе, они есть :)

Я обрабытываю ручками, сделал вставку в PrimeRecord для каждого файла:
If MyField =0 then setnull(MyField).

Может есть более свежие идеи на эту тему?
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Re: Setnull()

Сообщение Andrew™ »

ru_alex писал(а):Всем привет!

Народ, кто как решает вопрос с полями в SQL, которые Null?
В любой, более менее реляционной базе, они есть :)

Я обрабытываю ручками, сделал вставку в PrimeRecord для каждого файла:
If MyField =0 then setnull(MyField).

Может есть более свежие идеи на эту тему?
а какие свежие идеи, такие правила с FILE,DRIVER
ежели проектирование БД в твоих руках советую очень осторожно
разрешать NULL, для числовых полей я вообще бы отказался от NULL
даже если ты и сможешь работать c NULL полями, могут возникнуть проблемы другого характера, а именно, при поисках по таким полям где есть NULL индексы будут игнорироваться и будет происходить сканирование всей таблицы.
Это правило хорошо видно когда сам FILE,DRIVER создаёт таблицу через CREATE(FILE), на все поля, которые включены в индексы NULL запрещается
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Сообщение ru_alex »

Да и так, где только можно запретил...
Остались только поля для связей между таблицами, вроде без этого-то никак. Но нормального инструментария для работы с null полями у Clarion, согласитесь нет. Намного меньше гемороя было бы, если например была возможность "заменять" 0 на null автоматически (в драйвере что-ли :) ). Конечно это далеко не решает всех проблем, но все-же классический случай, когда связи по Table Identity Column, описывает.
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

ru_alex писал(а):Да и так, где только можно запретил...
Остались только поля для связей между таблицами, вроде без этого-то никак. Но нормального инструментария для работы с null полями у Clarion, согласитесь нет. Намного меньше гемороя было бы, если например была возможность "заменять" 0 на null автоматически (в драйвере что-ли :) ). Конечно это далеко не решает всех проблем, но все-же классический случай, когда связи по Table Identity Column, описывает.
маленькая поправочка, это не у Clarion'а нормального инструментария для работы с NULL полями нет, это у FILE,DRIVER.
Как мне, так я этой проблемы и не вижу в своих разработках, хотя так же разрабытываю клиетт-серверные приложения в Clarion, правда без FILE,DRIVER

ЦИТАТА:
Намного меньше гемороя было бы, если например была возможность "заменять" 0 на null автоматически

это именно то, что у меня и реализовано!
библиотека самам рюхает для каких полей разрешён NULL, а для каких нет, и для пустых строковых бросает NULL, и для числовых если 0 то NULL, хотя принудительно можно и 0 засунуть.
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Сообщение ru_alex »

У меня есть одна проблема по возможности использования MAV.
Основное разрабатываемое приложение поддерживает базу в формате TPS и MSSQL. DCT файлы разные, APP одинаковые, с использованием флажка, по которому и обрабатываются различия между TPS и SQL версией.

Возможно я ошибаюсь, но использовать MAV (полностью перевести SQL версию с File,Driver на Direct ODBC) и совмещать в одних APP две версии не получится.
Есть предложения? :)
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

ru_alex писал(а):У меня есть одна проблема по возможности использования MAV.
Основное разрабатываемое приложение поддерживает базу в формате TPS и MSSQL. DCT файлы разные, APP одинаковые, с использованием флажка, по которому и обрабатываются различия между TPS и SQL версией.

Возможно я ошибаюсь, но использовать MAV (полностью перевести SQL версию с File,Driver на Direct ODBC) и совмещать в одних APP две версии не получится.
Есть предложения? :)
через COMPILE и OMIT секции элементарно
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Сообщение ru_alex »

Всем привет!

Может кому-то немного поможет следующее при использовании ABC и FILE,DRIVER:

В APP, где объявляются файлы, объявляешь процедуру с именем, например, SetNullFileField(STRING FileLabel)

В файле ABFILE.TPW каталога TEMPLATE, ищешь #GROUP(%FileManagerVirtuals, %TreeText, %DataText, %CodeText), и в нее пишешь следующий код:

Код: Выделить всё

#GROUP(%FileManagerVirtuals, %TreeText, %DataText, %CodeText)
#EMBED(%FileManagerDataSection,'File Manager Data Section'),%File,%pClassMethod,%pClassMethodPrototype,PREPARE(,%FixClassName(%FixBaseClassToUse('FileManager:' & %File))),TREE(%TreeText & %DataText)
  #?CODE
#!
#! вставка для обработки MSSQL null полей
#!
#! begin
#IF(%pClassMethod='PrimeAutoInc' OR %pClassMethod='TryPrimeAutoInc' OR %pClassMethod='Update' OR %pClassMethod='TryUpdate'  OR %pClassMethod='Insert' OR %pClassMethod='TryInsert')
  #FOR(%Procedure)
    #IF(%Procedure='SetNullFileField')
  SetNullFileField('%File')
      #BREAK
    #ENDIF
  #ENDFOR
#ENDIF
#! end
#!
  #EMBED(%FileManagerCodeSection,'File Manager Executable Code Section'),%File,%pClassMethod,%pClassMethodPrototype,PREPARE(,%FixClassName(%FixBaseClassToUse('FileManager:' & %File))),TREE(%TreeText & %CodeText)
#!
#!
В процедуре SetNullFileField(STRING FileLabel) примерно следующий
код:

Код: Выделить всё

case clip(FileLabel)
of 'MyFile'
  if MyFiled=0 then setnull(MyFiled).
end
Получается удобно:
1) все редактируется в одном месте
2) при добавлении, удалении файлов опять же не надо лазить по глобальным embed
3) эту процедуру можно использовать во всей программе, где есть ручная обработка файлов, главное в нее передавать метку файла как строку
4) Если в APP нет процедуры с именем SetNullFileField, то и генериться код не будет, и другие проекты не пострадают
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

ru_alex писал(а):Всем привет!

Может кому-то немного поможет следующее при использовании ABC и FILE,DRIVER:

В APP, где объявляются файлы, объявляешь процедуру с именем, например, SetNullFileField(STRING FileLabel)

В файле ABFILE.TPW каталога TEMPLATE, ищешь #GROUP(%FileManagerVirtuals, %TreeText, %DataText, %CodeText), и в нее пишешь следующий код:
не очень хорошее решение, т к надо всегда помнить при обновлении Clarion, что и шаблон(ы) нужно базовые корректировать.

ЗЫ
правило номер раз - базовые шаблоны не изменять!!!
лучше напиши свой класс шаблонов который тоже самое делает
сколько пишу шаблоны пока что не было такого случая чтобы я из своего класса шаблонов не смог влезть в базовый.
Последний раз редактировалось Andrew™ 18 Январь 2006, 16:17, всего редактировалось 1 раз.
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Сообщение ru_alex »

Посностью со всем согласен, но шаблоны я пишу не так давно :wink:

Если есть время, может напишешь как реализовать эту фичу без изменения базовых шаблонов?
Ответить