UniCommand различия для UniData
Я новичок в мире UniObjects, так как я был в.NET земле с момента его дебюта. После создания простого приложения для возврата списка выбора оператора UniCommand я заметил, что существуют некоторые существенные различия в том, как UniData и как UniObjects анализируют оценки UniCommand. Из того, что я обнаружил, похоже, что это различия в вкусе используемого PICK.
Я спрашиваю других программистов UniObjects (UniVerse или UniData), которые знают о различиях или знают команды, которые можно выполнить, чтобы перечислить их здесь. Я спрашиваю об этом, потому что документацию о том, что может и не может быть командой, очень сложно найти.
Вот пример: (оба возвращают одинаковые результаты из одного и того же источника)
Что мы будем вводить в UniData: (ошибка парсера, если дано в UniCommand)
- ВЫБРАТЬ ЦВЕТА = "СИНИЙ"
Что следует ввести в UniCommand UniObject:
- ВЫБЕРИТЕ ЦВЕТА С @ID, КАК "BLU..."
Обратите внимание, что подстановочный знак UniData - это "]" (квадратная скобка), где UniCommand - это "..." (elipsis). Также обратите внимание, как UniData принимает оператор равенства и как UniCommand использует оператор LIKE и WITH.
Также, если у кого-либо есть ссылка на документ по всем доступным командам, он также может опубликовать его здесь.
3 ответа
Команда ECLTYPE "U" работает с интерактивным сеансом из TCL, но я вижу, как сложно было бы постоянно устанавливать из UniObjects.
Уловка Unidata из уст в уста, которую удобно знать, состоит в том, что глаголы в нижнем регистре всегда выполняются как ECLTYPE U. Таким образом, вы получите нужное поведение, независимо от вида учетной записи. Так что это должно работать нормально:
select COLORS WITH @ID LIKE "BLU..."
Проблема заключается в том, что ваша среда Unidata настроена на синтаксический анализ команд с помощью синтаксического анализатора PICK, но объект UniCommand выполняет собственный анализатор Unidata. (Синтаксис LIKE и... взят из основного режима Unidata, который смоделирован из Prime Information.)
Я искал свойство в UniSession или UniCommand, которое могло бы изменить синтаксический анализатор, который используется для метода Execute, но не нашел его. Однако документация UniCommand гласит, что это эквивалентно основному выражению EXECUTE. Эта и некоторые команды UDT.OPTIONS могут открыть путь к обходному пути, который позволит вам использовать синтаксис команды PICK, даже если UniObjects не поддерживает его напрямую.
Команда EXECUTE в Unidata может принимать несколько команд, разделенных @AM, и будет выполнять их одну за другой, возвращая только после того, как все будет обработано. (Это что-то вроде минипроцесса.) Итак, соберите вашу команду, по крайней мере, с командой "UDT.OPTIONS 2 ON" в атрибуте 1, за которой следуют любые другие, которые вам могут понадобиться, и, наконец, желаемая команда PICK в последней приписывать. Затем отправьте всю связку сразу через метод Execute вашего объекта UniCommand.
Документация для UDT.OPTIONS 2 выглядит следующим образом:
Determines the parser the system uses to interpret UniQuery commands.
ON System uses the Pick® parser.
OFF System uses the UniData parser.
Есть несколько других UDT.OPTIONS, связанных с совместимостью PICK. Посмотрите документы, в частности файл udto.pdf, в разделе "Совместимость Pick®".
Все это говорит, что когда я использую UniObjects, я использовал его только для вызова основных подпрограмм и обработки всего остального в подпрограммах на стороне сервера.
РЕДАКТИРОВАТЬ: пример кода C#
UniSession s = UniObjects.OpenSession("machine", "user", "password", "/path/to/account", "udcs");
UniCommand c = s.CreateUniCommand();
c.Command = "UDT.OPTIONS 2 ON" + "\xfe" + "SELECT COLORS = \"BLU]\"";
c.Execute();
"\ Xfe" является меткой атрибута. (Это CHAR(254) в Pick-говорить.) Надеюсь, это поможет.
Различия, которые вы описываете, - это различия в ECLTYPE в UniData, который полностью независим от UniObjects. Если вы установите ECLTYPE вашей учетной записи UniData на "U", он примет синтаксис:
SELECT COLORS WITH @ID LIKE "BLU..."
Если вы установите ECLTYPE на "P", он примет синтаксис:
SELECT COLORS = "BLU]"
Документация UniObjects для.NET гласит:
"В системах UniData лучше использовать ECLTYPE U. Вы можете столкнуться с вариациями с другими настройками ECLTYPE или UDT.OPTIONS".
Из документации мне не ясно, выполняются ли UniCommands неизменно с использованием ECLTYPE "U"
или есть ли параметр, позволяющий вам настроить тип анализатора. Вы можете попробовать выполнить ECLTYPE "P"
введите команду из сеанса UniObjects и посмотрите, анализируются ли последующие UniCommands с синтаксисом "P" как таковые.