Форум » Clipper » Изучаю Clipper » Ответить

Изучаю Clipper

demetrius2003: Доброго всем времени суток! Решил немного подучить Clipper. Это не для учёбы, не для работы. Так для себя. С удивлением обнаружил, что в сети нет нормальных учебников по Clipper. Есть Norton guides с описанием функций, но мне необходим имеено учебник с примерами и описанием происходящего. Для чайников. Что именно интересует: 1. Структура программы (если он есть, как в Паскале?) 2. Типы данных 3. Ввод-вывод 4. Операторы цикла, ветвления и т. д. 5. Желательны примеры работы с dbf-файлами. Открытие, выборка записей, изменение их, удаление, и т. д. Что сделал самостоятельно: Скачал Clipper 5.3. Установил его в DosBox. Создал программу hello.prg с содержимым: ? "Hello world" Скомпилировал его и слинковал blinker'ом. В результате всё работает. Мне бы двинуться дальше, но не могу - инфы для изучения нет!

Ответов - 80, стр: 1 2 3 4 All

demetrius2003: Не, не. Мозг то не резиновый. Пока достаточно Клиппера.

AlexMyr: demetrius2003 пишет: Не, не. Мозг то не резиновый. Пока достаточно Клиппера. А чего ждать, разбираться все равно придется рано или поздно , так что будет тема - поможем

PSP: demetrius2003, для Harbour: hbmk2 <имя prg> - получаешь .exe


Сыроежка: demetrius2003 пишет: (Кстати! Как в форум код правильно вставлять? Есть ли теги CODE /CODE или наподобие?) Для кода я выбираю моноширинный шрифт. Но у него есть недостаток, что он некоторые символы кода рассматривает, как символы форматирования текста. Например, индекс элемента массива я указываю обрамленным в пробелы, то есть следующим образом: a[ i ]. Если этого не делать, то индекс не выводится, а получается только a, как будто бы допущена ошибка в коде. (Вопрос по программе - USE открывает базу data. Так? А если мне надо сразу несколько баз открытыми держать, то как система узнает, к примеру, чей LASTREC() использовать? 3. Как менять значения полей в произвольной записи, выбранной скажем по номеру? У Clipper имеется 256 рабочих областей для баз данных. Что это означает? Что имеется таблица из 255 записей, в которой он строит структуры, связанные с базой дданных. То есть одноврменно вы можете максимально теоретически открыть 255 баз данных. Рабочая область с номером 0 используется для текущей базы данных. У Clipper имеется система драйверов для работы с базами данных. Поэтому вы можете работать с любыми типами баз данных, лишь бы был соответсвующий драйвер, который удовлетворяет требованиям Clipper к драйверам баз данных. Вы также можете открывать базу данных и в команде открытия указывать, какой драйвер будет задействован для этой базы данных. В Clipper 5.01 вы можете одновременно использовать лишь 4 драйвера баз данных. В более сттарших версиях таких ограничений нет. С каждой базой данной при открытии вы можете связывать алиас и обращаться к базе данных по имени алиаса. Я не помню, но, кажется, если вы не указываете сами алиас, то имя базы данных становится алиасом. так как Clipper писался еще для старых операционных систем DOS, то максимальный путь, включая имя самого файла, не должен превышать 64 знака. На самом деле в DOS, насколько я помню, задание полной спецификации файла может составлять 81 байт, то есть 64 байта - это вложенные директории, 12 - байтов - имя файла, 2 байта - имя диска с двоеточием, обозначение корневого директория и слеш для разделения вложенных директориев от имени файла. То есть всего получается 80 байтов плюс заключительный нулевой байт. Но Clipper для этого отводит лишь 64 ,плюс заключительный ноль. Поэтому вам не следует глубоко на диске "закапывать" свои базы данных.

demetrius2003: Хм. Работает в Харборе мой примерчик! Токма размер exe у него... Сыроежка, спасибо за наводку про драйверы. Надо будет копнуть в этом напрвлении.

AlexMyr: demetrius2003 пишет: Хм. Работает в Харборе мой примерчик! Работает, куда он денется. demetrius2003 пишет: Токма размер exe у него... Как выясняется это уже не актуально сейчас, а вот скорость работы проги собранной с помощью harbour превосходит аналогичную прогу собранную clipper. Еще exe на harbour можно сжать upx-ом.

gustow: AlexMyr пишет: Как выясняется это уже не актуально сейчас, а вот скорость работы проги собранной с помощью harbour превосходит аналогичную прогу собранную clipper. Еще exe на harbour можно сжать upx-ом. Ооо, там (в (x)Harbour'е) еще такооое можно делать!.. :) :) Я тут некогда начал на основе раздела "What's MiniGUI" файла помощи MiniGUI.chm (который идет с библиотекой MiniGUI Ext., которую Григорий Филатов собирает - см. тему в форуме http://clipper.borda.ru/?1-1-0-00000283-000-0-0-1328691952) делать некий "курс молодого MiniGUI-бойца" (см. http://gustow.narod.ru/harbour/MiniGUI_help/welcome.htm) (еще на примере help'а от версии 1.5.54 2008 года) - да позабросил, всё руки не доходят... Но хоть что-то для "первый раз в первый класс" Harbour-школы... :)

demetrius2003: Ладно, ещё вопрос. Читаю документацию. Частенько встречаю выражение Get-области. Но объяснения, что же это такое нет. Но это так, мелочь. Главное же, что меня озадачило сегодня - реляции. Т. е. как я понял весь цимус в команде SET RELATIONS TO? Вот пример. Есть две таблички. Описание первой: [pre2] # #=============================================================================== #==TABLE no 25 : Справочник Номенклатура # Name |Descr |Type[A/S/U]|DBTableName|ReUsable T=SC33 |Справочник Номенклатура |A |SC33 |1 #-----Fields------- # Name |Descr |Type|Length|Precision F=ID |ID object |C |9 |0 F=PARENTID |ID parent obj |C |9 |0 F=CODE |object code |C |6 |0 F=DESCR |object description |C |100 |0 F=ISFOLDER |Flag - Is Line - Fol|N |1 |0 F=ISMARK |Flag Object is Marke|C |1 |0 F=VERSTAMP |Version stamp |C |6 |0 F=SP3752 |(P)Артикул |C |25 |0 F=SP3757 |(P)БазоваяЕдиница |C |9 |0 F=SP124 |(P)ВалютаУчета |C |9 |0 F=SP3792 |(P)Вес |N |15 |3 F=SP689 |(P)ВидТовара |C |9 |0 F=SP5514 |(P)ГруппаДляДекларац|C |9 |0 F=SP4374 |(P)ГТД |C |9 |0 F=SP3753 |(P)ЕдиницаПоУмолчани|C |9 |0 F=SP5515 |(P)КодИД |C |10 |0 F=SP3755 |(P)МинимальныйОстато|N |15 |3 F=SP5516 |(P)НаимДляКассы |C |12 |0 F=SP4089 |(P)НомерГТД |C |21 |0 F=SP3756 |(P)ОКДП |C |7 |0 F=SP5517 |(P)Отходы |C |9 |0 F=SP5518 |(P)Признак |C |9 |0 F=SP5519 |(P)Размер |C |9 |0 F=SP5520 |(P)СрокГодности |D |8 |0 F=SP3304 |(P)СтатьяИздержекУсл|C |9 |0 F=SP4091 |(P)СтранаПроисхожден|C |30 |0 F=SP3563 |(P)ТипТовара |C |9 |0 F=SP5521 |(P)ТовСкид |N |11 |0 F=SP3815 |(P)ТорговаяНаценка |N |7 |2 F=SP5522 |(P)Убыль |C |9 |0 F=SP3866 |(P)УчетнаяЦена |N |16 |2 F=SP5523 |(P)ЦеноваяСхема |C |9 |0 F=SP3559 |(P)ШтрихКод |C |13 |0 #----Indexes------ # Name |Descr |Unique|Indexed fields |DBName I=IDD |of ID |0 |ID |IDD I=PCODE |of PARENT and |0 |PARENTID,ISFOLDER,CODE(UPPER) |PCODE I=PDESCR |of PARENT and |0 |PARENTID,ISFOLDER,DESCR(UPPER) |PDESCR I=CODE |of CODE |0 |CODE(UPPER) |CODE I=DESCR |of DESCR |0 |DESCR(UPPER) |DESCR I=VI3752 |VI3752 |0 |SP3752(UPPER=128) |VI3752 I=VIP3752 |VIP3752 |0 |PARENTID,ISFOLDER,SP3752(UPPER=128) |VIP3752 I=VI5514 |VI5514 |0 |SP5514 |VI5514 I=VIP5514 |VIP5514 |0 |PARENTID,ISFOLDER,SP5514 |VIP5514 I=VI4374 |VI4374 |0 |SP4374 |VI4374 I=VIP4374 |VIP4374 |0 |PARENTID,ISFOLDER,SP4374 |VIP4374 I=VI5515 |VI5515 |0 |SP5515(UPPER=128) |VI5515 I=VIP5515 |VIP5515 |0 |PARENTID,ISFOLDER,SP5515(UPPER=128) |VIP5515 I=VI3563 |VI3563 |0 |SP3563,DESCR(UPPER) |VI3563 I=VIP3563 |VIP3563 |0 |PARENTID,ISFOLDER,SP3563,DESCR(UPPER) |VIP3563 I=VI3559 |VI3559 |0 |SP3559(UPPER=128),DESCR(UPPER) |VI3559 I=VIP3559 |VIP3559 |0 |PARENTID,ISFOLDER,SP3559(UPPER=128),DESCR(UPPER) |VIP3559 # [/pre2] Описание второй: [pre2] # #=============================================================================== #==TABLE no 92 : Документ (Мн.ч.) Перемещение # Name |Descr |Type[A/S/U]|DBTableName|ReUsable T=DT239 |Документ (Мн.ч.) Перемещение |A |DT239 |1 #-----Fields------- # Name |Descr |Type|Length|Precision F=IDDOC |ID Document's |C |9 |0 F=LINENO |LineNo |N |4 |0 F=SP249 |(P)Товар |C |9 |0 F=SP250 |(P)Количество |N |15 |3 F=SP251 |(P)Единица |C |9 |0 F=SP1034 |(P)Коэффициент |N |11 |3 F=SP5880 |(P)Цена |N |16 |2 F=SP5881 |(P)Сумма |N |18 |2 F=SP5882 |(P)Проц |N |11 |1 F=SP5883 |(P)ЦенаИсх |N |11 |2 F=SP5884 |(P)СуммаИсх |N |18 |2 #----Indexes------ # Name |Descr |Unique|Indexed fields |DBName I=IDLINE |of IDDOC+LineN|0 |IDDOC,LINENO |IDLINE # [/pre2] Собственно первая таблица - справочник товаров. Вторая - документы типа перемещение. Но не в этом суть. Если я начну выводить строки скажем первого документа, то вместо наименований товаров и их атрибутов я увижу их ID (поле SP249). Как вместо поля SP249 выводить данные из первой таблицы. Т. е. как именно связь осуществить? И последнее. Прошу сильно не пинать, но действительно этого пока не понимаю. Зачем нужны индексные файлы? Ведь можно вполне и без них обойтись? Они ведь не несут смысловой нагрузки? В данном случае я прекрасно без них работаю с табличками.

AlexMyr: demetrius2003 пишет: И последнее. Прошу сильно не пинать, но действительно этого пока не понимаю. Зачем нужны индексные файлы? Ведь можно вполне и без них обойтись? Они ведь не несут смысловой нагрузки? В данном случае я прекрасно без них работаю с табличками. Зачем в мне в библиотеке картотека? Я буду по одной книге перебирать и найду то, что ищу demetrius2003 пишет: Т. е. как именно связь осуществить? Так demetrius2003 пишет: SET RELATIONS TO? доку смотрели по этой команде?

demetrius2003: Вот именно, что не понимаю, зачем в библиотеке картотека? Я бы по незнанию в цикле записи перебирал. Вот такая глупость! Вот пример, реально работающий, выводящий все строчки 4 документа: [pre2] ? "Start program" USE SC33 NEW USE DT239 NEW SELECT DT239 FOR i=1 TO LASTREC() lineno = LINENO tovar = SP249 kolvo = SP250 cena = SP5880 summa = SP5881 IF IDDOC = " 4" ? lineno, tovar, kolvo, cena, summa ENDIF SKIP 1 NEXT ? "End program, press a key" INKEY(0) CLOSE data [/pre2] Вместо товара - айдишник в виде непонятного набора символов. Доку по команде SET RELATIONS TO сижу изучаю.

AlexMyr: [pre]? "Start program" USE SC33 NEW USE DT239 NEW index on iddoc to dt239 SELECT DT239 ordscope(0," 4") ordscope(1," 4") dbgotop() dbeval({||qout(lineno, tovar, kolvo, cena, summa)}) ? "End program, press a key" INKEY(0) CLOSE data [/pre] Ну батенька, знаете что такое обфускация, тогда изучайте нормализацию и индексацию

demetrius2003: Вот пример, работает как надо, т. е. как я хочу. Но медленооооо... [pre2] ? "Start program" USE SC33 NEW USE DT239 NEW SELECT DT239 FOR i=1 TO LASTREC() lineno = LINENO tovarid = SP249 SELECT SC33 LOCATE FOR ID = tovarid tovar = DESCR SELECT DT239 kolvo = SP250 cena = SP5880 summa = SP5881 IF IDDOC = " 4" ? lineno, tovar, kolvo, cena, summa ENDIF SKIP 1 NEXT ? "End program, press a key" INKEY(0) CLOSE data [/pre2] Т. е. как я понял, индекс позволит мне не искать каждый раз, где находится необходимая мне запись? Т. е. заранее будет известно где что лежит и работать соответственно будет в разы быстрее? Я так полагаю к Клипперу это не имеет прямого отношения, т. е. тут уже копать надо в дисциплину под общим названием "Базы данных". И да, ещё в догонку. Кто как борется с кодовыми страницами? Я так понимаю встроенных средств перекодировки в Клиппере нет? Т. е. если у меня таблицы в cp1251, то едиственный вариант - писать функцию перекодировки самому?

AlexMyr: Снова, смотрим в сторону Harbour

Dima: demetrius2003 пишет: Т. е. как я понял, индекс позволит мне не искать каждый раз, где находится необходимая мне запись? есть у тебя база и в ней мильон записей , как ты будешь искать IDDOC равное " 4" не имея индекса по этому полю ? Думаю только перебором что будет очень долго. А при наличии индекса сделать это можно просто и без затрат по времени [pre2] if dbseek(" 4" ) ? "Найдено" else ? "Не найдено" endif [/pre2] demetrius2003 пишет: LOCATE FOR ID = tovarid После Locate хорошо бы проверить результат поиска с помощью Found()

Dima: demetrius2003 пишет: Т. е. если у меня таблицы в cp1251, то едиственный вариант - писать функцию перекодировки самому? Есть уже написанная , могу дать Вот тут http://clipper.borda.ru/?1-0-0-00000128-000-0-0-1255341201

gustow: demetrius2003 , тут (http://online.spb4plus.ru/index.html?01_info.htm) доку по Клипперу (онлайновую, правда) смотрели? Это оцифровка (не совсем полностью) книжки года 1990го, кажется, по Клиппер 5.01 - который лично я пользую до сих пор. Для понимания базовых идей типа "реляционности" (и, соответственно, назначения команд типа SET RELATION TO ... INTO ...) почитайте что угодно про тот же Фокспро (про "реляционные базы данных"); а учиться с самого начала на форуме, задавая вопросы по всем мелочам, о которых можно прочитать где-то - только свое и чужое время тратить, думаю.

demetrius2003: gustow, я Вам мешаю? Или может отнял у Вас слишком много Вашего времени? Извиняюсь. Учится с самого начала на форуме есть смысл. Особенно если этот форум почти единственный источник информации по заданной теме. Онлайн-оцифровки не в счёт (их уже есть у меня) - они никогда не заменят живое общение. Про реляции - я понял, что напал на неизвестный мне пласт информации. И я изучу его без помощи форумчан, потому как этой инфы в сети с избытком. Но более-менее въехать в Клиппер без помощи всё тех же форумчан у меня (да и у других начинающих с нуля я думаю тоже) не получится. А так посудить, так мы все приходя на различные форумы тратим своё время и время чужое - админов, модераторов и пользователей форума. Так и получается, начинающие приходят, задают глупые вопросы, получают пинки в нужном направлении, и более менее разобравшись двигаются дальше самостоятельно.

gustow: Прошу прощения, что потратил Ваше время на чтение моего ответа (да еще впридачу - на написание ответа на мой глупый ответ).

demetrius2003: Ребята! Чисто технический вопрос. Есть код: [pre2] ? "Start program" USE DT239 NEW ? "Start dt239" INDEX ON IDDOC TO DT239 USE SC33 NEW ? "Start sc33" INDEX ON ID TO SC33 [/pre2] Размер ДБФ-файлов: DT239 - 34574 байт SC33 - 9208530 байт Смысл в том, что построение индекса таблицы DT239 проходит моментально, а SC33 мягко говоря нет. Т. е. не понятно, идёл ли оно вообще, или всё повисло. Ждал более часа, менял виртуалку на qemu. Каким образом можно контролировать этот процесс?

Dima: demetrius2003 Какая версия Clipper ?



полная версия страницы