А. Шевелёв - DbfWebServer. Способ эффективной работы с таблицами DBFв среде Интернет
- Название:DbfWebServer. Способ эффективной работы с таблицами DBFв среде Интернет
- Автор:
- Жанр:
- Издательство:Литагент Ридеро
- Год:неизвестен
- ISBN:9785448522871
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
А. Шевелёв - DbfWebServer. Способ эффективной работы с таблицами DBFв среде Интернет краткое содержание
DbfWebServer. Способ эффективной работы с таблицами DBFв среде Интернет - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
Интерпретатор
Интерпретатором является сама программа IxBase. Размер программы составляет порядка 460Кб. Код скомпилирован в 1993 г. При компиляции использован стандартный набор функций CLIPPER 5.1. Это было сделано в расчёте на то, что в будущем возможна миграция на другую программную платформу или операционную систему. Использование стандартных функций даёт больше шансов для такой операции.
Для полной гармонии и согласованности с операционной системой и оконным режимом работы программы подключена библиотека CT2. Эта библиотека формирует пользовательский интерфейс с использованием окон.
Используется библиотека SIX для работы с индексами типа *.CDX. Этот индекс хорош тем, что очень быстр и создает только один физический файл на диске. Иногда это очень удобно, например, для проектов, где задействовано большое количество таблиц. Каждая таблица – это два файла. Операционная система имеет ограничение на количество открываемых файлов. Для операционной системы ДОС это значение по умолчанию равно 20, то есть одновременно можно открыть двадцать файлов, или десять таблиц.
Для работы с текстовыми файлами используется библиотека NANFOR. Очень часто приходится экспортировать и импортировать данные в текстовом формате. Самым универсальным в этом смысле является текстовый файл. Для такого рода шлюзования необходим удобный инструмент. Идеально, чтобы он напоминал способ работы системы управления таблицами. Все это предоставляют функции библиотеки NANFOR. К текстовому файлу можно обращаться как к таблице, используя аналогичные функции навигации.
В рамках данного проекта организован специальный посредник работы с итераторами таблиц и массивов. Итераторы – это специальные функции, которые выполняют определённый набор операций для каждой записи таблицы. Итераторы в качестве аргументов требуют блоков кода, например:
dbEval ({|| F:=FieldGet (1)}, {||.t.}, {||.t.})
где dbEval – итератор таблицы;
{||.t.} – блок кода;
FieldGet (1) – операция для текущей записи;
aEval (A:=aArray (10), {| i,x | P1:=x})
где aEval – итератор массива.
Однако в системе управления базами данных CLIPPER версии 5.1 вызов блока кода из блока кода недопустим (этот недостаток ликвидирован в системе xHarbour)
eval (eval ({||.t.}))
поэтому необходим посредник, с помощью которого блок кода можно передать в виде строки, например
stEval (» F:=FieldGet (1)»,». t.»,». t.»)
где stEval – итератор для текущей записи;
«.t. " – блок кода в виде строки;
FieldGet (1) – операция для текущей записи;
asEval (A:=aArray (10), " P1:=x»)
где asEval – итератор массива.
Движок блоков кода
Сами по себе блоки кода – потрясающее достижение в программировании. Продолжение развития этой идеи, блоков кода (тримплетты) и виртуальной машины мы видим и в технологии Java. Блоки кода повсеместно используются в исходном тексте рассматриваемой программы. Это стало стилем программирования и элементом, позволяющим перенести часть исходного кода из компилируемой части программы в базу данных. Блоки кода позволяют строить очень изящные конструкции. Уменьшается объём исходного кода, повышается функциональность и выразительность программного кода.
Блоки кода можно хранить в базе данных в виде строк. С другой стороны, блоки кода можно хранить в массиве в скомпилированном виде, готовом для немедленного использования. Эти и другие свойства блоков кода дают возможность построить очень простой и эффективный движок блоков кода системы IxBase.
Напомним, что представляет собой блок кода. Блок кода – это безымянная функция. Синтаксис этой функции следующий:
{| a1,a2 |.t.}
Хотя функция эта безымянная, ссылку на неё можно присвоить переменной
bC:= {| a1,a2 |.t.}
и выполнить с помощью функции eval ()
Eval (bC)
В эту функцию можно передать параметры, функция с аргументами прмет следующий вид:
Eval (bC, a1,a2)
Список параметров безымянной функции при объявлении располагается между двумя вертикальными линиями:
{|a1,a2|.t.}
Движок блоков кода системы IxBase – это функция DbfRun (cName). В функцию передается имя блока кода, хранящегося в базе данных, который необходимо выполнить. Текст рабочей функции программы IxBase приведен ниже:
*********************************************************
FUNCTION dbfRun (iOrd)
/********************************************************
Синтаксис:
DbfRun (iOrd) —> evalution
Аргументы:
iOrd – имя блока кода, который необходимо выполнить.
Возвращаемое значение:
после выполнения функция возвращает результат выполнения блока кода.
Описание:
Функция системная.
На ее базе сформирован менеджер-интерпретатор блоков кода.
Функция работает с таблицей DBFBLO00.dbf
Если вызываемый вектор не существует в таблице блоков кода, то он будет создан.
Выполнение блоков кода поддерживается стеком, размер которого определен массивом arrDbfRun [].
Откомпилированный блок помещается в массив для повторного использования.
Например:
DBFRUN («ALLUSE00F2») – вызывается на выполнение блок кода с именем «ALLUSE00F2»
Файл: ixBase.prg
Автор: Анатолий Шевелев.
Дата создания: 1993 год.
Дата последнего изменения: 1995 год.
*********************************************************
LOCAL reT:=.t.
LOCAL inT:=aScan (arrDbfRun, {|z| z [1] ==iOrd})
LOCAL ixB
IF inT=0
aDel (arrDbfRun,1)
IF (ixB:=DbfBlo00-> (NaiSpr (iOrd,1,3))) =»»
ixAddVal (ixB, iOrd, SubStr (iOrd,9),ixB:=«*»)
ixB:=» {||.t.}»
ELSEIF ixB=«*»
ixB:=» {||.t.}»
ELSEIF ixB=» {|»
ELSE
ixB:=» {||"+ixB+»}»
ENDIF
arrDbfRun [Int:=Len (arrDbfRun)]:= {iOrd,& (ixB)}
END
BEGIN SEQUENCE
ixO:=iOrd
reT:=eVal (arrDbfRun [inT,2])
RECOVER
eval (& (» {||.t.}»))
errorblock (ErrorBlock ({||.t.}))
END SEQUENCE
RETURN reT
*********************************************************
Таблица для хранения блоков кода
Эта таблица для программы является системной и ключевой. Таблица состоит из трех полей. Первое поле хранит имя фолдера блока кода. Второе – предназначено для спецификаций имени вектора обработки вызова из программы. Третье – содержит сам блок кода.
Конец ознакомительного фрагмента.
Текст предоставлен ООО «ЛитРес».
Прочитайте эту книгу целиком, на ЛитРес.
Безопасно оплатить книгу можно банковской картой Visa, MasterCard, Maestro, со счета мобильного телефона, с платежного терминала, в салоне МТС или Связной, через PayPal, WebMoney, Яндекс.Деньги, QIWI Кошелек, бонусными картами или другим удобным Вам способом.
ixBase | |||
---|---|---|---|
] +substr (fieldget (2),1,10)
+ [ |
] +fieldget (3)
+ [ |
] +HB_OemToAnsi (fieldget (5))
,if (i==1,U_karbeg:=RecNo ()) ,if (i==2,N_karbeg:=Fieldget (1)) ,i++ }, [»»], [], [FieldGet (1)],V_karbeg, [.t.],.f.,maxele+1) ,E_karbeg:=fieldget (1)),kC:=0,L_karbeg:=i-1, cb+= [ parent.B.M.F.karbeg.focus (); parent.B.M.F.R.value=’r’; parent.B.K.location.href='karbeg0022.html’; ] + [ |
|
Дата | Номер | Цена | Документ]
,REZZAK00-> (dbSeek (K_K) ,cb+ [ |
] +substr (FieldGet (3),1,10) + [ | ] +FieldGet (2) + [ | ] +FieldGet (4) + [ | ] +FieldGet (5)
) |
Интервал:
Закладка: