powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / CLIPPER
52 сообщений из 52, показаны все 3 страниц
CLIPPER
    #34264452
barsukof
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возникла неоходимость разобрать прогу написанную на CLIPPER-е, подскажите где можно найти какие-нибудь книжки , FAQ по теме.
...
Рейтинг: 0 / 0
CLIPPER
    #34264590
barsukofВозникла неоходимость разобрать прогу написанную на CLIPPER-е, подскажите где можно найти какие-нибудь книжки , FAQ по теме.
Была неплохая книга Рика Спенсера по программированию на клиппере 5.01... Найти ее - только в библиотеке...
Вообще-то сложного немного: инкремент/декремент как в С++, присваивание как в Паскале (:=), 4 класса (Броуз, Колумн, Еррор и еще какой-то), команды препроцессора и заголовочные файлы (опять же аналогия с С++)...

Остальное - сильно смахивает на FoxPro/DOS...


А разобрать - это как? Декомпилировать или понять что написано?
...
Рейтинг: 0 / 0
CLIPPER
    #34264930
barsukof
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Станислав С barsukofВозникла неоходимость разобрать прогу написанную на CLIPPER-е, подскажите где можно найти какие-нибудь книжки , FAQ по теме.
Была неплохая книга Рика Спенсера по программированию на клиппере 5.01... Найти ее - только в библиотеке...
Вообще-то сложного немного: инкремент/декремент как в С++, присваивание как в Паскале (:=), 4 класса (Броуз, Колумн, Еррор и еще какой-то), команды препроцессора и заголовочные файлы (опять же аналогия с С++)...

Остальное - сильно смахивает на FoxPro/DOS...


А разобрать - это как? Декомпилировать или понять что написано?
Есть исходники , но периодически вознивают вопросы, по операторам, времени жалко на угадывание, хотя в общем все читаемо
...
Рейтинг: 0 / 0
CLIPPER
    #34264988
barsukof
Есть исходники , но периодически вознивают вопросы, по операторам, времени жалко на угадывание, хотя в общем все читаемоПошли письмо на мыло: stanislav1971 на mail точка ru, скину тебе Norton Guide (такая интерактивная справка по Клипперу..... Правда работает либо под чистым ДОСом, либо в Фаре)
...
Рейтинг: 0 / 0
CLIPPER
    #34266069
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barsukofЕсть исходники , но периодически вознивают вопросы, по операторам, времени жалко на угадывание, хотя в общем все читаемоА спрашивай... здесь старых клипперистов много. Пороемся в памяти :)
...
Рейтинг: 0 / 0
CLIPPER
    #34266229
barsukoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl barsukofЕсть исходники , но периодически вознивают вопросы, по операторам, времени жалко на угадывание, хотя в общем все читаемоА спрашивай... здесь старых клипперистов много. Пороемся в памяти :)
Да просто хотелаось бы типа небольшого FAQ-а по функциям, если у кого есть.
Чтоб хотя бы в текстовике быстернько по Ctrl+F найти попавшуюся функцию.
Типа dtos , dbseek,RLOCK(),конструкция DBSEEK(PADL(TABEL->TABN,5)+"20000101"+"1") ,то есть инутитивно вроде понятно, но хотелось бы подтвердить свои догадки.
А так же примеры работы с базами, я так понял в клиппере как бы создается alias базы и работа идет с ним
Код: plaintext
1.
2.
select &sa20    //t020
SET ORDER TO  1 
...
Рейтинг: 0 / 0
CLIPPER
    #34266377
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barsukoff White Owl barsukofЕсть исходники , но периодически вознивают вопросы, по операторам, времени жалко на угадывание, хотя в общем все читаемоА спрашивай... здесь старых клипперистов много. Пороемся в памяти :)
Да просто хотелаось бы типа небольшого FAQ-а по функциям, если у кого есть.Ну это НортонГада надо брать :) В те времена это был самый прогрессивный формат хранения документации... Полное описание Клиппера весит примерно два-три мегабайта.
А еще можешь заглянуть сюда: http://www.itk.ru/clip/aboutclip.shtml Это один из потомков Клиппера, там есть вроде неплохая документация.

barsukoffТипа dtos , dbseek,RLOCK(),конструкция DBSEEK(PADL(TABEL->TABN,5)+"20000101"+"1") ,то есть инутитивно вроде понятно, но хотелось бы подтвердить свои догадки.
dtos - Date TO String конвертация date в string
dbseek - поиск по таблице на основе индекса. Параметр функции должен совпадать с типом поля (или функции) по которой создан индекс.
rlock - блокирование записи для много-пользовательского режима, остальные юзера смогут запись читать, но не смогут изменять.
padl - PAD Left - добавить текстовую строку (первый параметр) слева пробелами до указаной общей длины (второй параметр)

barsukoffА так же примеры работы с базами, я так понял в клиппере как бы создается alias базы и работа идет с нимНе совсем так. В Клиппере, как и во всех table-based СУБД используется принцип областей (страниц). Представь что работаешь с Excel - очень похоже будет. Клиппер может одновременно загрузить в память до 255 таблиц, одна из этих таблиц считается активной. Все функции и команды работы с таблицей (тот же dbseek например) идут в эту активную таблицу. Переключаться между таблицами можно командой select номер_области или select алиас_таблицы .
Чтобы начать работать с новой таблицей сначала переключаешься в нужную область, потом командуешь use имя_dbf_файла , если хочешь, можешь в use указать и алиас для таблицы, иначе алиасом будет имя dbf файла.
Как я уже говорил, одна из областей всегда активна. Если надо обратится к неактивной в данный момент области, то используется синтаксис со стрелочкой " -> " Слева от нее пишется алиас таблицы или номер области, справа имя поля в таблице или табличная функция которую надо запустить на указаную область.
TABEL->TABN - это обращаение к полю tabn в области с алиасом tabel

Код: plaintext
select &sa20    //t020
Ну двойной слэш это коментарий :) А вот значок амперсанда это макроподстановка. В рантайме заполняется текстовая или целочисленная переменная, а потом значение этой переменной отдается в select как параметр. В общем, выбор новой активной области на основе переменной sa20.

Код: plaintext
SET ORDER TO  1 
А это работа с индексами... В отличие от SQL где ты просто создаешь индексы на таблицу, а сервер самостоятельно потом решает какой из индексов использовать, в потомках dBase используется ручное активирование индексов.
В команде use есть параметр index в котором перечисляются несколько индексных файлов, например
use orders index byCode, byDate, byCity
По умолчанию первый индекс в списке активный. Команды типа seek|dbseek всегда работают по активному индексу. Переключаешься на другой индекс командой set order to N, где N это номер индекса в списке как он был задан в use. Впрочем, вместо перечисления индексов в use можно использовать несколько пар set order to N, set index index_file
...
Рейтинг: 0 / 0
CLIPPER
    #34266422
barsukoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за советы
White OwlНу это НортонГада надо брать :)
нашел - взял.
нашел и книгу в сети, как ни странно нашел APORT-ом.
YA,GG и RAMBLER выдавали только книжные магазины.
Теперь будем читать теорию
...
Рейтинг: 0 / 0
CLIPPER
    #34266824
Фотография klen_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос по Clipper-у задавай здесь. Чем могу помогу.
...
Рейтинг: 0 / 0
CLIPPER
    #34267593
Serik Akhmetov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barsukoffнашел и книгу в сети Интересная тема. Поделитесь ссылкой.
...
Рейтинг: 0 / 0
CLIPPER
    #34269436
barsukoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Serik Akhmetov barsukoffнашел и книгу в сети Интересная тема. Поделитесь ссылкой.
Откуда утянул не помню, пособие небольшое (0,5 не литра как подумали некоторые, а метра) , типа как МАНы в линухе.
Могу выслать, моё почтовое отделение gerasimon[осторожно-злая собака!]mail.ru
...
Рейтинг: 0 / 0
CLIPPER
    #34642068
K52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
K52
Гость
klen_Вопрос по Clipper-у задавай здесь. Чем могу помогу.
Задаю вопрос.
У меня СУБД, написанная в Clipper'e, прекрасно работает вот уже более 10 лет - под DOS'oм и в сеансах DOS'а Win95/98. Более 40 пользователей, около 40 постоянно открытых dbf-файлов, интенсивно работают примерно 10 пользователей одновременно. Сеть под NetWare 5.0, 100 Мбит/сек.
Но если эту же СУБД запустить в сеансе DOS'а Win2000/XP - индексы рушатся при первой же попытке что-то ввести в индексированный файл.
Может быть тут есть некая фишка в настойках NetWare или Windows?
...
Рейтинг: 0 / 0
CLIPPER
    #34642271
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
K52Но если эту же СУБД запустить в сеансе DOS'а Win2000/XP - индексы рушатся при первой же попытке что-то ввести в индексированный файл.
Может быть тут есть некая фишка в настойках NetWare или Windows?Винды... Клиппер открывает МНОГО файлов одновременно, а по умолчанию винды дают для DOS-сессии ... не помню, но недостаточное количество файловых буферов.
Иди в ярлык запуска программы, на вкладке Program есть кнопка Advanced, там указываются два файла, перенаправь их на копии autoexec.bat и config.sys скопированые с DOS машины. Естественно их нужно будет слегка подправить - убрать ненужные драйвера и резиденты.
...
Рейтинг: 0 / 0
CLIPPER
    #34642439
Alex_Toms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barsukof

Пиши о прблемах, как тут уже сказали, попробуем помочь...

K52
У меня СУБД, написанная в Clipper'e, прекрасно работает вот уже более 10 лет - под DOS'oм и в сеансах DOS'а Win95/98. Более 40 пользователей, около 40 постоянно открытых dbf-файлов, интенсивно работают примерно 10 пользователей одновременно. Сеть под NetWare 5.0, 100 Мбит/сек.
Но если эту же СУБД запустить в сеансе DOS'а Win2000/XP - индексы рушатся при первой же попытке что-то ввести в индексированный файл.
Может быть тут есть некая фишка в настойках NetWare или Windows?


У меня прога работает 16 лет, в том числе и в W2K, 40 пользователей нет, но фалов точно более 40. Ничего не сыпется.

Настройка в файлах AUTOEXEC.NT и CONFIG.NT
На всякий случай может понадобится...
В DOS это в AUTOEXEC.BAT
В W2K это в AUTOEXEC.NT

REM Максимум 115 файлов параметр CLIPPER
SET CLIPPER=F:115
SET INCLUDE=E:\CLIPPER5\INCLUDE
SET LIB=E:\CLIPPER5\LIB
SET OBJ=E:\CLIPPER5\OBJ
SET PLL=E:\CLIPPER5\PLL
SET TEMP=C:\TEMP
PATH C:\;D:\DOS;D:\NC;D:\UT;D:\;E:\CLIPPER5\BIN;E:\CLIPPER5\NG;

В DOS это в CONFIG.SYS
В W2K это в CONFIG.NT

Максимум 120 файлов параметр DOS
FILES=120
...
Рейтинг: 0 / 0
CLIPPER
    #34642700
Фотография klen_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
K52Но если эту же СУБД запустить в сеансе DOS'а Win2000/XP - индексы рушатся при первой же попытке что-то ввести в индексированный файл.
Может быть тут есть некая фишка в настойках NetWare или Windows?фишка в настройках на каждой клиентской машине
короче настрой комп каждого пользователя вот так (см. вложение)
а если ваши проги написаны на Clipper 5.01, то вместо SET CLIPPER=F80 напиши SET CLIPPER=E0;F80
E0 - это отказ от использования расширенной памяти (5.01 почему-то глючит с ней, у меня так было)
F80 - всегда должно быть меньше , чем то что указано в Config.nt в параметре FILES

в принципе в параметре FILES я указывал и 140 и 160
и соответственно писал SET CLIPPER=F120
всё нормально работало
...
Рейтинг: 0 / 0
CLIPPER
    #34644559
K52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
K52
Гость
klen_напиши SET CLIPPER=E0;F80
E0 - это отказ от использования расширенной памяти (5.01 почему-то глючит с ней, у меня так было)


Прочитал отклики от klen_, Alex_Toms и White Owl. Большое спасибо всем за солидарность. Заинтересовало сообщение от Клёна:
SET CLIPPER=E0;F80

В этой связи вопрос Клёну: у Вас программа работает под Win2K/XP? Сколько пользователей одновременно вводят данные ? Каким образом конкретно у Вас глючило , когда ты не отказывался от Extended Memory? У меня рушились индексы, а у Вас?

У меня в файлах AUTOEXEC.NT и CONFIG.NT написано как положено:
В AUTOEXEC.NT - SET CLIPPER=F135
В CONFIG.NT - FILES=140
Иначе просто ничего бы не работало, поскольку по умолч. всего 40 дескрипторов файлов. У меня же окроме постоянно открытых 40 файлов ещё и их индексы, всего около 90 дескрипторов постоянно занято. Плюс еще куча временных файлов могут быть открыты.

Обязательно попробую с Е0. Но не прямо сейчас. Сейчас же для ясности повторю: имеется клипперная программа, которая идеально работает в сеансах ДОСа по Win98 в многопользовательском режиме, но глючит (рушатся индексы), если её пускать в сеансе ДОСа Win2K/XP.
...
Рейтинг: 0 / 0
CLIPPER
    #34646485
Фотография klen_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
K52 Привет!
Проги на Clipper 5.01 у нас работают и XP и в 98-ом
число пользователей (кто одновременно вводит информацию ) ну и не только вводят и отчёты просматривают,
не превышает 7 - 8 или 9 человек
число записей к середине года 100 000, к концу года 200 тысяч ( в принципе не много ), но индексов 8 файлов ntx
в autoexec.nt я писал SET CLIPPER=E0;F80 - сбоев нет ( но у нас нормальная сеть, 100 мегабит )
к тому же индексы, прога восстанавливает сама, выводя сообщение, мол всем выйти я сделаю сортировку, если видит что время и дата файлов dbf и индексов ntx отличаются (скажем на 5 минут)
так что я могу и не знать, запортились индексы или нет, главное данные не портятся в dbf
и к тому сервер делает архив данных каждую ночь и ещё вечером после работы сервер сжимает базу dbf, и заного создаёт все индексы.
Пробовал писать =E1024;F80 дабы выделить мегабайт для использования расш. ппамяти.
Вроде нормально работает, но иногда мышкой ведёшь через окно программы (хотя мышка не задействована в клиппер-программе),
прога исчезает без всяких сообщений, оставляя временные файлы (со случайным именем без расширения) в текущем каталоге
Этот глюк происходил только под XP.
В 98-ом мышкой крути как хочешь. Пересекай мышкой через окно клипперовской проги, ничего не срубается,
а под XP это риск, может срубится, может нет, причины не знаю
В книге "CLIPPER руководство по программированию" автор Рик Спенс
рекомендует писать =E0, но тогда речь шла о Windows 3-ей версии, которая ещё под ДОС-ом запускалась
...
Рейтинг: 0 / 0
CLIPPER
    #34647462
K52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
K52
Гость
Уважаемый klen_, спасибо за интересное сообщение. В ближайшую пятницу предложу нашему сисадмину.
Я, видите ли, работаю по пятницам на одном небольшой заводике, поддерживаю у них СУБД, которую сам же написал 12 лет назад. С тех пор они (заводик) купили и ИНФИН, и 1С, 2 года назад купили Галактику. Но продолжают работать с моей системой, написанной в Clipper’e 5.01 12 лет назад! (Конечно, за эти годы я написал кучу дополнительно всякого сервиса по просьбам пользователей и начальников). Т.е. эта система (для заводика) оказалась лучше и ИНФИН’a, и 1С, и Галактики!
Когда я запускал систему в 1995 году, заводик ещё работал на простенькой советской одноранговой сети ИОЛА. В этой ИОЛЕ, помнится, был т.н. бит кэширования запросов. Если в этом бите стоял 0, то при попытке одновременной записи на сервер с нескольких рабочих станций ИОЛУ клинило, и в результате индексы рушились. Если же в этом бите была 1, то ИОЛА правильно отрабатывала запросы на запись, даже если их было 10 штук сразу.
...
Рейтинг: 0 / 0
CLIPPER
    #34652066
Alex_Toms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
K52
Т.е. эта система (для заводика) оказалась лучше и ИНФИН’a, и 1С, и Галактики!

Если ваша система оказалась удачной, работает до сих пор и в будующем будет востребована, то однозначно нужно переводить на SQL.
В 1994г, на одном из предприятий я на Clipper’e 5.01 начинал делать прогу для бухгалтерского учёта. Пока работал один пользователь всё было ОК. Со временем разрабатывал другие модули и стала необходимость в работе более одного пользователя. Вот тогда и появились проблемы со сбоями, разрушение индексов, а также были случаи и таблиц. Сеть иногда глючила, не было ИБС на всех компах. Координально проблему удалось решить только переводом в 1996г на MSSQL, система прекрасно работает до сих пор, развивается, юзеров всё больше и больше...
Для вас, можно рассмотреть вариант с бесплатной СУБД, MSSQLExpress, OracleLite, MySql или что то другое...

Удачи.
...
Рейтинг: 0 / 0
CLIPPER
    #34652104
K52...имеется клипперная программа, которая идеально работает в сеансах ДОСа по Win98 в многопользовательском режиме, но глючит (рушатся индексы), если её пускать в сеансе ДОСа Win2K/XP.
Исходим из предположения, что чудес не бывает. Из описанной ситуации сразу же возникают вопросы:
- кто рушит индексы - сеанс ДОСа на любом компе с Win2K/XP или на конкретном компе?
- если заменить Win2k/XP на Win98 на том же самомо компе, то проблема сразу пропадает?
- нет ли проблем с оборудованием (сетевая карта, материнка и т.д.) на проблемном(ых) компе(ах)...

К чему я это? Просто на форуме по Фоксу часто обсуждаются подобные вопросы. Начальное предположение задающих подобный вопрос - Фокс глючный, это из-за него рушатся индексы, портятся dbf-ки и т.д. В процессе обсуждения выясняется, что проблема-то была в железе (на сервере, на рабочем месте, провода компьютерной сети и т.д.)...
Скорее всего здесь та же самая ситуация....
...
Рейтинг: 0 / 0
CLIPPER
    #34652670
Фотография klen_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если настройки в файлах autoexec.nt и config.nt не работают,
то приходиться открывать свойства "Мой компьютер" и указывать
в "Переменных средах" Clipper, Buffers, Files
...
Рейтинг: 0 / 0
CLIPPER
    #34654561
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Toms K52
Т.е. эта система (для заводика) оказалась лучше и ИНФИН’a, и 1С, и Галактики!

Если ваша система оказалась удачной, работает до сих пор и в будующем будет востребована, то однозначно нужно переводить на SQL. Все с точностью до наоборот. Если система оказалась удачной и работает до сих пор - ее ни в коем случае не надо трогать. Пусть работает. Паралельно можно разрабатывать аналогичную систему на более современных средствах, но оригинальную трогать не нужно. Вот если бы глючила, не справлялась с нагрузкой - тогда да, тогда действительно нужно переводить.
...
Рейтинг: 0 / 0
CLIPPER
    #34654707
Alex_Toms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
K52 пишет: Но если эту же СУБД запустить в сеансе DOS'а Win2000/XP - индексы рушатся при первой же попытке что-то ввести в индексированный файл.

То что система глючит, это факт. Вопрос то и был задан чтобы получить совет как от этого избавиться.
А по замене ПО... Я же не имел ввиду, грохнуть старую и мучится с новой. Как правило это делается так, сначала сделать новую прогу, перегнать туда данные, вести параллельно работу, выловить в идеале все ошибки, сравнить результаты работы, допустим на примере отчётов, а уж потом отказываться от старой. Возможны варианты...

Кстати вариант для K52, использовать терминальный доступ. Для 1С с DBF, это помогало...

Удачи.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
CLIPPER
    #36369035
subbota
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Посмотри на http://nova-mir.narod.ru
Оттуда по ссылкам можно собрать все что нужно для программирования на Clippper
Есть дельные советы и примеры
...
Рейтинг: 0 / 0
CLIPPER
    #36371570
Vowk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owldtos - Date TO String конвертация date в string

Не совсем так. Подобное можно сказать о dtoc(), а dtos() преобразует дату в строку по принципу "от страшего к младшуму" и без национальных особенностей для использования ее в индексных выражениях.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
CLIPPER
    #37942756
AndropXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите настроить Clipper программу.плз. при запуске просит провести индексацию, выбираем да или нет независимо от выбранного, при последующем появлении диалогово окна не реагирует клавиатура, работает ESC,закрывает программу в оконном режиме,стоит XP
...
Рейтинг: 0 / 0
CLIPPER
    #37943046
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А подождать?
Тем более, если у вас открывается DOS-приложение в окне, через ntvdm , то ресурсов процессора может ему быть выделено очень и очень мало...
...
Рейтинг: 0 / 0
CLIPPER
    #37953513
*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
*
Гость
harbour-project.org

На первый взгляд работает, и imho более стабильно чем оригинал. Объем переделки зависит от того, что использовалось в Clipper-программе. Ради любопытства попробовал перевести пару старых программ - переделать пришлось только написанные на Си модули вывода на экран и опроса мыши + несколько строк для установки кодировки символов.
...
Рейтинг: 0 / 0
CLIPPER
    #37989903
Глазунов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите пожалуйста разобрать код процедуры, в которую надо внести небольшие изменения.
Известно, что написана она на языке Alaska xBase++, который как я понял из яндекса, есть приемник Clipper'а.

После FoxPro синтаксис выглядит не совсем понятным.
Из имеющихся вопросов:
1. что означают скобки {} ?
2. Что означает -> ?
3. Что за команды EXTRACT(), ListToArray(), CDDialog() ?
4. Что за конструкци:
RESTR->( DB_SETORDER("SEARCH") ) ?
opJournSelect := JournSelect():new() ?
opJournSelect:AddVar( "DOCUM", ".T." ) ?
opJournSelect:SetExpression( "OPDATE.AND.CREDIT.AND.ACC.AND.DOCUM" ) ?

//реестр закупок товаров и услуг

LOCAL aParam
LOCAL cFilter
LOCAL opJournSelect
LOCAL cTabName := "RESTR"
LOCAL xTemp, nCount, aBR, aTemp, nRefBU, cFileAgree, aAcc, nI
LOCAL aGauge := {}
LOCAL cVendrAcc := ""
LOCAL cFacesAcc := ""

PRIVATE cpPeriod := ""
PRIVATE apParamF := {}


BEGIN_SEQUENCE

WindOpen( "RESTR",,"Реестр закупок товаров и услуг" )

aParam := CDDialog( "CDRZTU",,"Реестр закупок товаров и услуг" )
IF VALTYPE(aParam) == "A"
apParamF := ACLONE(aParam)
ENDIF

cFileAgree := FILE_NAME( "AGREE" )

IF !T_FILE( cFileAgree )
IF aParam[ 10 ]
ALERT( "SВ параметрах сборки указано что необходимо проверять суммы по реестру обязательств, хотя сам реестр обязательств не заполнен!!!" )
BREAK
ENDIF
ENDIF

IF !DBUSE( cFileAgree, "AGREE", .F. )
BREAK
ENDIF

AGREE->( DB_SETORDER( "DOCID" ) )

IF VALTYPE( aParam ) <> "A"
BREAK
ENDIF

IF !MacroFunc( "CreateDSD", { cTabName } )
BREAK
ENDIF

Moment("Анализ параметров сборки...")

cpPeriod := "с " + AllTrim( SayDate( aParam[4], "DD MMMMMM YYYY г." ) ) + " по " + AllTrim( SayDate( aParam[5], "DD MMMMMM YYYY г." ) )

aParam[1] := RTRIM( aParam[1] )

IF EMPTY( aParam[1] ) .OR. ( "ВСЕ"$UR( aParam[1] ) )
xTemp := EXTRACT( {}, "ARR", SprPath + "accnf.dbf", "CODE", ".T." )
aParam[1] := ArrayTOList( xTemp)
ENDIF

aTemp := ARRAY( 2 )

IF EMPTY( aParam[7] ) .OR. ( "ВСЕ"$UR( aParam[7] ) )
aTemp[1] := EXTRACT( {}, "ARR", SprPath + "refbu.dbf", "ITEMCODE", ".T." )
ELSE
aTemp[1] := ListToArray( aParam[7] )
ENDIF

IF EMPTY( aParam[2] ) .OR. ( "ВСЕ"$UR( aParam[2] ) )
aTemp[2] := getAccAnalitGroups(,,"FIELD->GROUP=7.OR.FIELD->GROUP=8")
ELSE
aTemp[2] := ListToArray( aParam[2] )
ENDIF

aParam[2] := ""

FOR xTemp := 1 TO LEN( aTemp[1] )
FOR nCount := 1 TO LEN( aTemp[2] )
aParam[2] += PADR( ALLTRIM(aTemp[1][xTemp]) + ALLTRIM(aTemp[2][nCount]), 10 ) + ","
NEXT
NEXT

IF EMPTY( aParam[6] ) .OR. ( "ВСЕ"$UR( aParam[6] ) )
xTemp := EXTRACT( {}, "ARR", SprPath + "such.dbf", "ENT", ".T." )
aParam[6] := ArrayTOList( xTemp )
ENDIF

IF EMPTY( aParam[2] ).OR.EMPTY( aParam[1] ).OR.EMPTY( aParam[6] )
BREAK
ENDIF

aAcc := ListToArray(aParam[2])

FOR nI := 1 TO LEN(aAcc)
IF GetAccField(aAcc[nI],"GROUP")== 7 // подотчетные лица
cFacesAcc += ";"+aAcc[nI]+" "
ELSE // поставщики
cVendrAcc += ";"+aAcc[nI]+" "
ENDIF
NEXT

cFilter := "KFKR $ '" + aParam[1] + "'.AND. ENTER_D $ '" + aParam[6] + "'"

IF !EMPTY( aParam[ 9 ] )
cFilter += ".AND. FIELD->ONAME == '" + aParam[ 9 ] + "'"
ENDIF

cFilter +=".AND.("

IF !EMPTY(cVendrAcc)
aParam[ 8 ] := RTRIM(aParam[ 8 ])
cFilter += "( KACC $ '"+cVendrAcc+"'.AND.TYPE_D==1.AND.!EMPTY(DONOR)"+IF(!EMPTY( aParam[ 8 ]),".AND.FIELD->DONOR $ '" +RTRIM(aParam[ 8 ]) + "'","")+")"
ENDIF

IF !EMPTY( cFacesAcc )
cFilter += IF(!EMPTY(cVendrAcc),".OR.","")+"( KACC $ '"+cFacesAcc+"'.AND.TYPE_D==2.AND.!EMPTY(DONOR)"+IF(!EMPTY( aParam[ 11 ]),".AND.SUBSTR(FIELD->DACC,2,3)!='302'"+".AND. FIELD->DONOR $ '" +RTRIM(aParam[ 11 ]) + "'","")+")"
ENDIF
cFilter +=")"

RESTR->( DB_SETORDER("SEARCH") )

opJournSelect := JournSelect():new()

IF !opJournSelect:Create( aParam[4], aParam[5] )
ALERT( "Невозможно открыть ЖБО. ")
Moment(.F.)
BREAK
ENDIF

opJournSelect:AddVar( "OPDATE", "DTOS(OPDATE)>='" + DTOS( aParam[4] ) + "'.AND.DTOS(OPDATE)<='" + DTOS( aParam[5] ) + "'" )
opJournSelect:AddVar( "CREDIT", cFilter )
opJournSelect:AddVar( "ACC", "!( SUBSTR( FIELD->KACC, 2, 3 ) == '206' ) " )
IF !EMPTY( aParam[ 12 ] ) .AND. UR( aParam[ 12 ] ) <> "[ВСЕ]"
opJournSelect:AddVar( "DOCUM", "ALLTRIM( DOCTYPE ) $ '" + ALLTRIM( aParam[ 12 ] ) + "' " )
ELSE
opJournSelect:AddVar( "DOCUM", ".T." )
ENDIF

opJournSelect:SetExpression( "OPDATE.AND.CREDIT.AND.ACC.AND.DOCUM" )
opJournSelect:Top()

Moment(.F.)

IF !opJournSelect:Eof

aGauge := { InitGauge( "Обработка ЖБО" ), 0, D( 1, JOURN->( REC() ) ) }

DO_WHILE !opJournSelect:Eof
UpdateGauge( aGauge[2]+=aGauge[3] )
IF opJournSelect:IsVisible()
IF !aParam[ 10 ] .OR. ( aParam[ 10 ] .AND. MacroFunc( "ПроверитьСуммуДоговора") )
MacroFunc("ADDREC")
ENDIF
ENDIF
opJournSelect:Skip()
ENDDO
WindClose( aGauge[1] )

ENDIF

opJournSelect:Destroy()

SETFKEY ( {"Помощь;Help('RESTR')","Печать;Print( 'RESTR' )",,,,,,,"Кальк.;Calculator()"} )
aBr := InitTableBrowse( { OkStructure(), MEMVAR->SysPath + "dynamic.dsc", MEMVAR->SysPath + "macro.dat" } )
TableBrowse( LocalPath + cTabName + ".dbf", LocalPath+ cTabName + ".dsd", "RESTR",,,,,,,,,, 3 )
InitTableBrowse( aBr )
RESTFKEY()

END_SEQUENCE

WindClose()

RETURN
...
Рейтинг: 0 / 0
CLIPPER
    #37990572
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГлазуновПосле FoxPro синтаксис выглядит не совсем понятным.
Из имеющихся вопросов:
1. что означают скобки {} ?В Клиппере такого кажется не было (или я уже не помню), но чисто по коду смахивает на задание массивов.

Глазунов2. Что означает -> ?Запуск табличной функции на неактивной таблице.
Вместо:
Код: sql
1.
2.
3.
use tabX
i= recno()
use tab_old

можно сделать
Код: sql
1.
tabX -> recno()


и не переключаться между таблицами.

Глазунов3. Что за команды EXTRACT(), ListToArray(), CDDialog() ?Вызов функций... Документацию в руки и читать-читать.

Глазунов4. Что за конструкци:
RESTR->( DB_SETORDER("SEARCH") ) ?
opJournSelect := JournSelect():new() ?
opJournSelect:AddVar( "DOCUM", ".T." ) ?
opJournSelect:SetExpression( "OPDATE.AND.CREDIT.AND.ACC.AND.DOCUM" ) ?

Смена сортировки на неактивной таблице.
Создание нового объекта.
Вызов методов этого объекта.
Класс JournSelect скорее всего собственный класс программы. В стандартных библиотеках я такого не помню.
...
Рейтинг: 0 / 0
CLIPPER
    #37991081
Глазунов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо!
...
Рейтинг: 0 / 0
CLIPPER
    #38086644
sindarfan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет, проконсультируйте по одной проблеме. Была база написанная на Clipper, но в один прекрасный момент пропала,т.е. был файл .DBF с данными,а стал фал .DBF пустой,с таким же названием только размер 0 Кб ,вопрос, мог ли файл сам себя перезатереть?или еще какой нибудь сбой?
...
Рейтинг: 0 / 0
CLIPPER
    #38086672
_мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sindarfanразмер 0 Кб ,вопросdbf не м.б. 0 Кб, т.к. всегда содержит заголовок.
...
Рейтинг: 0 / 0
CLIPPER
    #38086680
sindarfan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Согласен,там есть 3 пустых записи на этом файле,а должно быть 130 - 150 тысяч.
...
Рейтинг: 0 / 0
CLIPPER
    #38086703
sindarfan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
точнее даже так,можно ли его восстановить)
...
Рейтинг: 0 / 0
CLIPPER
    #38087003
tru55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sindarfanточнее даже так,можно ли его восстановить)
Дык если нет длины у файла, откуда его восстанавливать? Если только из backup...
...
Рейтинг: 0 / 0
CLIPPER
    #38087249
sindarfan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а по какой причине это могло произойти?причина само стерлось начальство не устраивает почему то
...
Рейтинг: 0 / 0
CLIPPER
    #38087301
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sindarfanа по какой причине это могло произойти?причина само стерлось начальство не устраивает почему тоВариантов почему пропал файл - миллиард. Начиная от злодея который мстит за невыплаченную зарплату и кончая гремлинами. DBF это простой файл подчиняющийся всем законам файлов. Его можно стереть, его можно открыть в Ворде или Экселе и подивившись на странные закорючки "поправить", чаще всего они умирают по причине шаловливых ручек.
Никаких встроенных механизмов восстановления данных в Клиппере нет. Если нету бэкапа - то опаньки, окончательные и бесповоротные.
...
Рейтинг: 0 / 0
CLIPPER
    #38198374
Глазунов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите разобраться с функцией ASORT().

Из справки
ASORT() Сортировка элементов массива по возрастанию значений
ASORT(<массив>, [<вырN1>], [<вырN2>]] [блок]) -->массив

Пример сортировки вложенного массива:

aKids := { {"Mary", 14}, {"Joe", 23}, {"Art", 16} }
aSortKids := ASORT(aKids,,, { |x, y| x[2] < y[2] })

Результат:

{ {"Mary", 14}, {"Art", 16}, {"Joe", 23} }

У меня есть массив apData, элементами которого являются также являются массивы из 6 элементов.
Пример:
имеем исходный массив
apData =
{
{"Name1", "n", "10531", "Petr", "14", "345"},
{"Name3", "n", "10531", "Ivan", "14", "345"},
{"Name2", "n", "10532", "Petr", "34", "545"},
{"Name1", "n", "10532", "Petr", "44", "645"},
{"Name1", "n", "10532", "Ivan", "74", "569"},
{"Name2", "n", "10531", "Ivan", "33", "987"}
}

надо отсортировать его следующим образом (по возрастанию): сначала по элементу 4, потом по элементу 3, потом по элементу 1.
Т.е. надо получить в итоге

{
{"Name2", "n", "10531", "Ivan", "33", "987"}
{"Name3", "n", "10531", "Ivan", "14", "345"},

{"Name1", "n", "10532", "Ivan", "74", "569"},

{"Name1", "n", "10531", "Petr", "14", "345"},

{"Name1", "n", "10532", "Petr", "44", "645"},
{"Name2", "n", "10532", "Petr", "34", "545"},

}

Как должна выглядеть команда ASORT() ?

Пишу asort(apData,,,{|x,y| x[4] < y[4]}), получаю сортировку по имени (элемент 4), а как дальше не знаю.

Подскажите пожалуйста.
...
Рейтинг: 0 / 0
CLIPPER
    #38199000
sld
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sld
Гость
может чонить навроде
asort(apData,,,{|x,y| x[4] < y[4] .AND. x[5] < y[5] })
...
Рейтинг: 0 / 0
CLIPPER
    #38199066
Глазунов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sldможет чонить навроде
asort(apData,,,{|x,y| x[4] < y[4] .AND. x[5] < y[5] })

Пробовал с .AND., вообще не понял как отсортировалось. Т.е. и не 4, и не 5, и не 4 и внутри по 5, и не по 5 и внутри по 4.

Неужто в Clipper такой простейшей операции, как сортировка массива по нескольким признакам сразу нет?

Столкнулся с Clipper впервые и после FoxPro просто в шоке, насколько все заморочено.
...
Рейтинг: 0 / 0
CLIPPER
    #38199250
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГлазуновПробовал с .AND., вообще не понял как отсортировалось. Т.е. и не 4, и не 5, и не 4 и внутри по 5, и не по 5 и внутри по 4.
Все элементарно:
asort(apData,,,{|x,y| x[4] < y[4] .OR . (x[4] = y[4] .AND. x[3] < y[3]) .OR . (x[4] = y[4] .AND. x[3] = y[3] .AND. x[1] < y[1])})

ГлазуновНеужто в Clipper такой простейшей операции, как сортировка массива по нескольким признакам сразу нет?Неа, нету. Если есть возможность писать свои функции для сортировки, зачем делать специальную функцию в языке?

ГлазуновСтолкнулся с Clipper впервые и после FoxPro просто в шоке, насколько все заморочено.Зато у Клиппера намного больше возможностей чем у Фокса. Когда я был вынужден перейти с Клиппера на Фокс я весь изматерился на дурацкие ограничения Фокса и его примитивный синтаксис. Переход обратно был просто счастьем и наслаждением.
...
Рейтинг: 0 / 0
CLIPPER
    #38199608
AlexLearnsApex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlВсе элементарно:
asort(apData,,,{|x,y| x[4] < y[4] .OR . (x[4] = y[4] .AND. x[3] < y[3]) .OR . (x[4] = y[4] .AND. x[3] = y[3] .AND. x[1] < y[1])})


Можно еще элементарней

asort(apData,,,{|x,y| x[4]+x[3]+x[1] < y[4]+y[4]+y[3]})

если элементы массива могут иметь различную длину, дополнить падлом.
...
Рейтинг: 0 / 0
CLIPPER
    #38199617
AlexLearnsApex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexLearnsApexy[4]+y[4]+y[3]


Прошу прощения, здесь, конечно, y[4]+y[3]+y[1]
...
Рейтинг: 0 / 0
CLIPPER
    #38199714
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexLearnsApexWhite OwlВсе элементарно:
asort(apData,,,{|x,y| x[4] < y[4] .OR . (x[4] = y[4] .AND. x[3] < y[3]) .OR . (x[4] = y[4] .AND. x[3] = y[3] .AND. x[1] < y[1])})


Можно еще элементарней

asort(apData,,,{|x,y| x[4]+x[3]+x[1] < y[4]+y[4]+y[3]})

если элементы массива могут иметь различную длину, дополнить падлом.Можно и так. Но это будет чуть-чуть медленнее на больших объемах.
...
Рейтинг: 0 / 0
CLIPPER
    #38199913
Глазунов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо!

Результат достигнут.
...
Рейтинг: 0 / 0
CLIPPER
    #38199922
Глазунов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlЗато у Клиппера намного больше возможностей чем у Фокса. Когда я был вынужден перейти с Клиппера на Фокс я весь изматерился на дурацкие ограничения Фокса и его примитивный синтаксис. Переход обратно был просто счастьем и наслаждением.

Можно чуть подробнее про возможности Клиппера, т.к. это моя первая доработка проекта, но чуствую не последняя.

И если не затруднит приведите пример ограничения Фокса и примитивный синтаксис. Не ради дискуссии, а просвещения для.
...
Рейтинг: 0 / 0
CLIPPER
    #38201100
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГлазуновWhite OwlЗато у Клиппера намного больше возможностей чем у Фокса. Когда я был вынужден перейти с Клиппера на Фокс я весь изматерился на дурацкие ограничения Фокса и его примитивный синтаксис. Переход обратно был просто счастьем и наслаждением.Можно чуть подробнее про возможности Клиппера, т.к. это моя первая доработка проекта, но чуствую не последняя.

И если не затруднит приведите пример ограничения Фокса и примитивный синтаксис. Не ради дискуссии, а просвещения для.
Ну полный список я дать не смогу - давно это все было. Да и с современным Фоксом я не знаком, мой опыт лисоводства остановился в середине 90-х. Так что с учетом этого:

В FoxPro 2.5, мне жутко не хватало уже упомянутого синтаксиса с блоками:
somefunc(params, {|arg| subfunc } )

У досового Фокса были очень примитивные UI элементы и они были целиком "вещью в себе", Клипперский UI из коробки тоже был не особо удобен, но его можно было расширять. У пятого Клиппера UI уже был сделан на основе почти полноценного ООП и там можно было нарисовать все что угодно.

В Фоксе нельзя было запускать табличные функции по неактивной таблице, надо было обязательно переключить на нужную таблицу, выполнить функцию, потом переключаться обратно. У Клиппера такого ограничения нет, там есть синтаксис alias->func().

Вставки на С или ASM в Клиппере делались совершенно элементарно. Достаточно было скомпилировать объектник с нужным алгоритмом и он напрямую подхватывался rtlink'ом. Для Фокса писать на С было далеко не так просто. Кажется это было возможно, но...
...
Рейтинг: 0 / 0
CLIPPER
    #38204739
AlexLearnsApex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Глазунов,

В фоксе нет создания массивов как в Вашем вопросе, с фигурными скобками.
Нет операторов типа ++, += и т.п.
...
Рейтинг: 0 / 0
CLIPPER
    #38204920
Фотография asws
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кодовые блоки в Clipper - имхо самое сильное его преимущество для того времени,
они компилировались перед выполнением, при этом их текст мог храниться в таблицах.

Для работы пользователя с табличными даными можно было обойтись без псевдоклассов, вызывая пользовательскую функцию из DBEDIT,
а в ней реализуя нужный функционал + визуальное оформление (простой пример - выделение красным отрицательных чисел).

Недостаток Clipper-а - отсутствие дефолтной поддержки мыши (я работал с версией 5.01).

Давно уже было, поздабыл, но вроде так.
...
Рейтинг: 0 / 0
CLIPPER
    #38210257
Дааа, Клиппер -- именно 5.01 Клиппер -- это Язык!
По сути дела, одна синтаксическая конструкция: (область)->функция(аргументы). Плюс Цэшные {}, ++, -- и навороты типа блоков {|параметры| последовательность функций}. Всё прочее -- расширением синтаксиса, то, что в Цэ называется препроцессор, только в Клиппере не простенькие макрокомандочки, а что-то уровня Yacc.
...
Рейтинг: 0 / 0
CLIPPER
    #38210260
Да, ещё забыл -- драйвера баз данных, правда, с ними конкретно не разбирался. Он умел не только со своими базами работать.
...
Рейтинг: 0 / 0
52 сообщений из 52, показаны все 3 страниц
Форумы / Программирование [игнор отключен] [закрыт для гостей] / CLIPPER
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]