nordk пишет:
При такой конструкции в сети на 10 пользователей Вы точно совершенно две одинаковые записи не получите.
Мы говорим о механизме записи: я не проверял точность индексного ключа и т.п.
Ну, чтож, давайте проверим. (Хотя при чем тут индекс).
Для этого возьмем функцию, создающую Н\Н с заполнением нескольких полей. Ту, которую рассмотрели ранее:
Код
STATIC PROCEDURE CreateNewProduct()
Local sNewNNumReal:=Space(13)
SET ORDER TO TAG TAG_NNum
DbGoBottom()
sNewNNumReal:=mlabel->nnum
if(sNewNNumReal==AllTrim(sNewNNumReal))
if(.NOT.(IfAllChar(sNewNNumReal)))
WHILE Mlabel->(DBSEEK(UPPER(" "+sNewNNumReal)))
sNewNNumReal:=InCreaseOne(MLABEL->NNUM)
ENDDO
Mlabel->(ADDREC())
Mlabel->NNUM:=sNewNNumReal
Mlabel->GRUP:="00001"
Mlabel->NAME:="Новая"
Mlabel->FULLNAME:="Новая полное"
Mlabel->ORD_POLICY:=1
Mlabel->ID_LABEL:=StepPlus()
Mlabel->mdim:="0000000000000000001040"
Mlabel->( F_DBUNLOCK() )
endif
endif
return
Функции, которая использует ф-я создани ном-ры приведу ниже.
Теперь, используем эту функции в нашей спецфункции:
Код
StartTest()
STATIC PROCEDURE StartTest()
Local Temp_I:=0
Local dStart,dEnd
dBpUSH()
dStart:=Time()
If (DbF()=="MLABEL")
For Temp_i:=1 to 20000
CreateNewProduct()
NEXT
ENDIF
dEnd:=TIME()
SayAndWait("Время старта "+Var2Char(dStart)+" время окончания"+Var2Char(dEnd))
DbPop()
RETURN
Будет выводиться время начала и время окончания работы спецф-ии.
Подготовим справ номенклатуры. Для этого удалим там все записи, создадим запись под номером "0000000000001"(Этого изначально требует работа со справочником) в группе "00001". У нас запущено одно окно.
1. Запускаем спецфункцию. (Создадим 20к записей для "веса").
2. Запускаем 2е окно и как можно быстрее запускаем в обоих окнах спецфункцию.
Результат записываем. Вот что получилось у меня(МИН:СЕК):
1.10:50 - 11:08. Dbf Viewer показывает 20001 запись. Н\Н Последней 20001.
2. 1е окно: 13:23 - 13:59
2е окно: 13:24 - 14:00
Результат: Dbf Viewer показывает 60001 запись. Н\Н Последней 42276.
Проведем 2й раз опыт (подгтовка справочника, реиндексация).
1.33:07 - 33:21. Dbf Viewer показывает 20001 запись. Н\Н Последней 20001.
2. 1е окно: 34:20 - 34:57
2е окно: 34:21 - 34:58
Результат: Dbf Viewer показывает 60001 запись. Н\Н Последней 42103.
Результат, в общем-то плачевный. Получилось, что около 18000 записей дублируют номера. (Хотя один раз получился результат с дубляжом порядка 500 записей, там был немного др алгоритм, но принцип проверки тот же.).
Теперь рассмотрим причину, по которой такое происходит. Обратимся к куску кода:
Жирным выделением отметил место где начинается "критический" код и где он заканчивается. Если разделить эти участки кода от одновременного исполнения - то никаких ошибок не будет. Как это сделать сейчас?
Естественно "заморозить" процесс я не могу. Однако, можно поступить по-идиотски, а именно разделить его так:
Цитата
Do While (.NOT.(lUnique).AND.(nJ<1000))
TRY
USE (sPath) NEW Alias TEmp
lUnique:=.T.
SELECT ("MLABEL")
SET ORDER TO TAG TAG_NNum
CATCH oErr
nJ+=1
end
enddo//правильнее еще сделать проверку на велич счетчика.
WHILE Mlabel->(DBSEEK(UPPER(" "+sNewNNumReal)))
sNewNNumReal:=InCreaseOne(MLABEL->NNUM) ENDDO
Mlabel->(ADDREC())
Mlabel->NNUM:=sNewNNumReal
Mlabel->GRUP:="00001"
Mlabel->NAME:="Новая"
Mlabel->FULLNAME:="Новая полное"
Mlabel->ORD_POLICY:=1
Mlabel->ID_LABEL:=StepPlus()
Mlabel->mdim:="0000000000000000001040"
Mlabel->( F_DBUNLOCK() ) Close Temp
Имея такой инструмент, можно было бы вообще отказаться от проверки и переделать алгоритм, но посмотрим что получиться при таком коде.
Результаты:
1. 14:21 - 14:39. Записей 20001, Н\Н последней 20001. Все верно.
2. 1е окно 15:28 - 16:27
2е окно 15:29 - 16:28
Результат: Записей - 60001, номер последней записи 60001. А это значит, что не допущено ни единой ошибки!!!!
Код
Function IncreaseOne(cString)
Local nLength:=0
Local cIncreased:=""
Local nPosition:=0 //Цифра - разряд
nLength:=len(cString)
cIncreased:=stuff(cString,1,nLength-1,"")
If(IsDigit(cIncreased))
nPosition:=Val(cIncreased)
if(nPosition==9)
if(nLength==1)
cIncreased:=""// нужен сЛУЧАЙНЫЙ СИМВОЛ
else
nPosition:=0
cIncreased:=IncreaseOne(stuff(cString,nLength,nLength,""))
if(.NOT.(cIncreased==""))
cString:=cIncreased+Var2Char(nPosition)
else
cString:=""
endif
endif
else
nPosition+=1
cString:=stuff(cString,nLength,nLength,Var2Char(nPosition))
endif
else
nPosition:=0
cIncreased:=IncreaseOne(stuff(cString,nLength,nLength,""))
if(.NOT.(cIncreased==""))
cString:=cIncreased+Var2Char(nPosition)
else
cString:=""
endif
endif
return cString
Function IfAllChar(cString)
Local bIfNotNumExist:=.T.
Local nLen:=len(cString),temp_i:=0,temp_j:=0
if (nLen!=0)
While(bIfNotNumExist)
if(IsDigit(cString))
bIfNotNumExist:=.F.
else
cString:=Stuff(cString,1,1,"")
endif
enddo
endif
return bIfNotNumExist
//Измененная ф-я создания:
STATIC PROCEDURE CreateNewProduct()
Local sNewNNumReal:=Space(13)
Local lUnique:=.F.
Local nJ:=1,oErr
Local sPath:=LoadPath()+"TEST\BOM_def"
SET ORDER TO TAG TAG_NNum
DbGoBottom()
sNewNNumReal:=mlabel->nnum
if(sNewNNumReal==AllTrim(sNewNNumReal))
if(.NOT.(IfAllChar(sNewNNumReal)))
Do While (.NOT.(lUnique).AND.(nJ<1000))
TRY
USE (sPath) NEW Alias TEmp
lUnique:=.T.
SELECT ("MLABEL")
SET ORDER TO TAG TAG_NNum
CATCH oErr
nJ+=1
end
enddo
WHILE Mlabel->(DBSEEK(UPPER(" "+sNewNNumReal)))
sNewNNumReal:=InCreaseOne(MLABEL->NNUM)
ENDDO
Mlabel->(ADDREC())
Mlabel->NNUM:=sNewNNumReal
Mlabel->GRUP:="00001"
Mlabel->NAME:="Новая"
Mlabel->FULLNAME:="Новая полное"
Mlabel->ORD_POLICY:=1
Mlabel->ID_LABEL:=StepPlus()
Mlabel->mdim:="0000000000000000001040"
Mlabel->( F_DBUNLOCK() )
Close Temp
endif
endif
return
//В качестве "Блокирующего" файла
//взял BOM_def, он у нас все
//равно пуст. Файл обязательно
// должен присутствовать в папке TEST!!!!!!
nordk пишет:
В плане самой записи вроде как верно, в плане логики - это Ваше решение...тут не сужу...
Что касается cNnum+=1 посмотрю - я это написал как вариант необычности харбора :)
В БЭСТ-4 ?1+"1" в отладчике показывает "2"
Дальше не экспериментировал, но обратил что работает...
Значит ли это, что такая "конструкция" исключает возможность возникновения 2х записей с одним и тем же Н\Н (При использовании по сети такой спецфункции, разумеется)?
Вы, кажется так предлагали:
Код
SET ORDER TO TAG TAG_NNum
DbGoBottom()
sNewNNumReal:=mlabel->nnum
if(sNewNNumReal==AllTrim(mlabel->nnum))
if(.NOT.(IfAllChar(AllTrim(sNewNNumReal))))
WHILE Mlabel->(DBSEEK(UPPER(" "+sNewNNumReal)))
sNewNNumReal:=InCreaseOne(MLABEL->NNUM)
ENDDO
Mlabel->(ADDREC())
Mlabel->NNUM:=sNewNNumReal
Mlabel->GRUP:="00001"
Mlabel->NAME:="Новая"
Mlabel->FULLNAME:="Новая полная"
Mlabel->ORD_POLICY:=1
Mlabel->ID_LABEL:=StepPlus()
Mlabel->mdim:="0000000000000000001040"
Mlabel->( F_DBUNLOCK() )
bIsCreated:=.T.
else
bIsCreated:=.F.
endif
else
bIsCreated:=.F.
endif
StepPlus() использовать нужно, уже посмотрел.
Таким образом, используя AddRec() и проверку на неповторяемость номера, получаем:
Код
SET ORDER TO TAG TAG_NNum
DbGoBottom()
if(mlabel->nnum==AllTrim(mlabel->nnum))
if(.NOT.(IfAllChar(AllTrim(mlabel->nnum))))
sNewNNumReal:=InCreaseOne(MLABEL->NNUM)
WHILE Mlabel->(DBSEEK(UPPER(" "+sNewNNumReal)))
sNewNNumReal:=InCreaseOne(MLABEL->NNUM)
ENDDO
Mlabel->(ADDREC())
Mlabel->NNUM:=sNewNNumReal
Mlabel->GRUP:="00001"
Mlabel->NAME:="Новая"
Mlabel->FULLNAME:="Новая полная"
Mlabel->ORD_POLICY:=1
Mlabel->ID_LABEL:=StepPlus()
Mlabel->mdim:="0000000000000000001040"
Mlabel->( F_DBUNLOCK() )
bIsCreated:=.T.
else
bIsCreated:=.F.
endif
else
bIsCreated:=.F.
endif
cNnum+=1 к строкам неприменимо, не хочет работать.
В коде создается "пустая" Н\ед, понятно, что нужно заполнить больше полей (таких как ед измерения, даты), чтобы не загромождать я их опустил.
Верно?
Честно говоря описания ф-ий не так подробны как хотелось бы. Попутно ы конкретно по AddRec().
1. Чем она существенно отличается от Append BLANK, кроме того, что делает блокировку, чем она лучше?
2. Что возвращает эта функция?
3. StepPlus() для уник поля надо делать или нет?
nordk пишет:
Саак простите - я в БЭСТ-5 у себя тоже что-то не нашел привычный раздел...
У Вас есть БЭСТ-4 или возможность скачать его ? - там есть help по программированию с описаниями внутренних функций БЭСТа....
У меня по Б-4 есть следующие файлы:
help4plus.chm
help4plus.chw
spb4+.chm
spb406.chm
spb407.chm
spb4010.chm
spb4048.chm
spb40366.chm
программирование_в_БЭСТ-4.chm
Какой именно файл описывает ф-ии БЭСТ'а?
Обычно, если чего-то "явно не хватало" (чисто интуитивно) читал help4plus.chm, но 99% по Б-5 хелп изучал. Что именно я должен знать?
Возможность скачать есть.
nordk пишет:
Насчет одновременности сделайте проверку по индексному ключу перед записью и запись и посадите 5 человек и жмите на счет 3 одновременно и попробуйте получить 2 одинаковых записи...
А проверку по-Вашему делать так:
Код
SET ORDER TO TAG TAG_NNum
Do while (.NOT.(lUnique))
DbGoBottom()
sNextNNUM:=InCreaseOne(MLABEL->NNUM)
SEEK (sNextNNUM)
if .NOT.(Found())
lUnique:=.T.
endif
enddo
В Windows есть папки для хранения временных файлов. "Переменные среды", как они названы в Windows. Там есть 2 типа: Системные и для Интеренет. Разработчики используют для Интернет:
Например, TEMP, лежащая по пути %USERPROFILE%\Local Settings\Temp (Обычно это "c:\Documents and settings\"+(sWindowsUserName)+"\Local Settings\Temp")
Есть ли команда, позволяющая определить данный путь?
nordk пишет:
Во-первых применяйте ADDREC() Вы все-таки не в свои таблицы писать собрались...
Во-вторых DBPUSH() делайте либо в начале, либо откройте свой алиас и он Вам вообще не нужен.
И я бы применил для проверки где-нить перед непосредственной записью в поле DBSEEK() по номенклатурному номеру если так переживаю за уникальность и если бы нашел то сделал бы еще +1 и все и ADDREC() и все запись создана и никаких семафоров и даром не надо.
Этот DbPush вообще лишний, я его убрал, этот код просто не раз дописывал и часто не было времени убрать лишнее, оставлял, так сказать и соображений "совместимости". Об AddRec() вообще впервые слышу (в описании его нет :( ). То что не всвои - испоьзую StepPlus(), если Вы об этом. По поводу повторной проверки также думал. Проблема не в том, что там такой номер может быть. При сортировке Н\Н по порядку при условии, что истинно для всех записей Len(AllTrim(Malbel->NNUM)==13) и нет символов в номерах (я позже сделаю контроль за этим)
Последний номер+1 просто не может существовать - это лишняя проверка. Проблема только в том, что 2 пользователя могут одновременно получить этот самый последний номер. Но это опять как я вижу.
nordk пишет:
Не видя исходного кода Ваши опасения понять не могу...
Для меня очень простая и обычная задача (в плане записи в таблицы)
В идеале должно быть так:
Код
1. Select MLABEL
2. SET ORDER TO TAG TAG_NNum
3. DbGoBottom()
4. sLastNNum:=Alltrim(mlabel->nnum)
5.DBPUSH("mlabel","MLABEL","",{sRealProductGrup,sRealProductGrup})
6.if(mlabel->nnum==AllTrim(mlabel->nnum))
7.if(.NOT.(IfAllChar(AllTrim(mlabel->nnum))))
8.sNewNNumReal:=IncreaseOne(sLastNNum)
9. Создание Новой номенклатуры Append BLANK'ом со значениями из переменных памяти.
закрытие IF'ов, dbpop()
if(mlabel->nnum==AllTrim(mlabel->nnum)) стоит т.к. у нас договоренность, что поле Н\Н заполнено полностью, все 13ть символов. IfAllChar() - возвращает .T. если нет ни одной цифры в символьном Н\Н. (Раньше была DoesCharExist(), т.к была договоренность использовать в Н\Н только цифры, но пользователи нарушают)
IncreaseOne() - Увеличивает на 1 число, записанное в виде символьной строки, символы-неЦифры заменяются нулями, и игнорируются как разряд.
В принципе, можно было бы выложить код, правда если Вам не страшно читать кучу мусора. Это первое, что я написал. Да и на самом деле у меня сейчас идет создание новоё Н\Н путем COPY TO И APPEND From - надо переделать.
Точно таким же образом идет создание в MLABEL2 ZAPAS\MLABAL и со спецификациями. (Сам принцип присвоения следующего номера)
Как я понял по полю STATUS определяется тип заказа. Если статус==3, то это "Заявки на продажу", там собственно дат производства нет.
Поле STATUS1 определяет черновик\чистовик.
Теперь, если мы формируем заказ прямо из прайс-листа (спецфункцией), самому заказу в поле СТАТУС запишем 3, а поле СТАТУС1 оставим пустым, то создасться Заказ продажи черновой, верно?
Далее, оттуда (из заказ продаж) при переводе в сводники нужно будет поменять СТАТУС на 4ку, а статус1 на 1, так ли это?
Далее, задать даты конечного изготовления конкретных изделий в строках заказа (rbookm). При этом дата окончания работ (которую заполняем при набивании сводника) должна быть позднее последнего ОКПП, как и даты изготовления иделий.
Подскажите, пожалуйста,какие поля еще необходимо учесть при таком переводе?
Нет возможности создать предварительный(черновой) Сводный заказ. (Их убрали начиная, кажется с СП7)
Очень нужен "Черновой" заказ. Полез в описание полей real\rbook о полях STATUS, STATUS1, STATUS2 толком ничего не написано.
Нам надо реализовать:
Создается черновой заказ (в нем естесственно даты изготовления изделий указаны быть не должны). Полсе того как заказ прошел фин контроль, пользователь может его перевести в статус нормальный, или к запуску.
1. Возможно ли в rbook сделать строки, не попадающие в ОКПП?
(Имеется ввиду хранить информацию о черновом варианте заказа в той же таблице, что и все без "последствий")
2. Возможно ли в rbookm (тут строки заказов храняться) сделать строки без дат изготовления? (Будет ли Б-5 на это ругаться?)
(Если ответ утвердительный можно бы тогда написаить спецфункцию, формирующую заказ прямо из прайс-листа)
Поэтому полями STATUS и интересуюсь.
Денис пишет:
А какая у вас ОС?
Буквально вчера ставил SP9 на наш терминальный сервер demo.bestnet.ru
ОС Windows 2003 Server +SP2, все вроде до этого ставилось нормально, но с SP9 тоже пока не выгрузил процесс установка до конца не прошла.
Проблема в том, что ошибка плавающая и стабильно отловить не получается. Постараемся к SP10 разобраться.
С уважением,
С.Павличенко
Мне кажется, что такие проблемы возникли, когда мы Б-5 установили из дистрибутива СП1-СП6. Когда я ставил БЭСТ из обычного дистрибутива, устанавливая по очереди СПаки (в одном из которых, кажется и был обновленный драйвер ключа) то СП9 установился нормально. Поэтому я и удивился, когда не смог поставить СП9 на рабочей машине. К стати дистриб СП1-СП6 выдает какую-то ошибку в момент после указания файла лицензий, что-то, вроде "Функция такая-то вернула код ошибки 87" 2 раза.
Самое интересное, что строки сводного заказа удалить нельзя, если войти в сводный заказ, который уже попал в ОКПП. А вот сам сводный заказ удалить можно!!!
Хотя уже неважно, написали спецфункцию.
nordk пишет:
ну и нет тут ничего сложного.
Заблокировали номенклатуру - сделали.
Разблокировали
и так далее по каждой табличке раздельно.
Ну что тут такого ?
А у меня перед созданием чего либо берется н\номер и код последней записи (по индесу), вот я и опасаюсь, как бы не вышло так, что этот номер последней записи не получили бы одновременно 2 пользователя один и тот же. И получиться 2 записи с одним номером.
nordk пишет:
Создали запись - в товарах, запомнили,
создали запись в материалах запомнили.
В записи материалов заполняем поле по заполненному коду в товарах.
Причем тут одновременно на некольских машинах ??
Ну будут разные номера в материалах и товарах и что ?
Нет смысла писать везде в один момент времени.
Для этого в справочнике поле есть для связки..
Разрывайте как хотите по времени работу операции 1 от операции 2 и от операции 3. И причем тут в этот же момент пытаться делать спецификацию. И причем тут разные компьютеры ???
И главное зачем это делать программно - я вот например очень не уверен что такой объект как спецификацию Вы грамотно повторите по правилам БЭСТа и считаю такие объекты надо делать инструментом БЭСТа и если его нет объяснять и просить чтобы были... А Вы еще вероятно потом эту базу будете в сервис-центр подсовывать в случае непонятных ошибок - найдите их...
Вы начните с описания задачи..а то судя по всему к ее реализации Вы подходите вообще не с той стороны...
Давайте рассмотрим задачу и как Вы хотите построить принцип ее реализации....
Без проблем!!! Просто то, о чем я говорю уже реализовано. Возник только об одновременном использовании и я удивляюсь почему только сейчас(сам виноват).
Задача такая:
Есть типовое изделие. Это такое изделие, которое описанно формулами. Формулами описан расход материалов на это изделие. Подставив конкретные значения в формулы - получаем расход материалов в числах на конкретное изделие. Грубо говоря, расчетная спецификация (к стати этот тип зарезервирован разработчиками, это к делу не относиться).
Для того, чтобы описать такое изделие пользователь должен задать формулы. Действия пользователя в Б-5:
1. Создает Н\Н в производстве.
2. Создает обычную спецификацию на него с "нулевым" расходом материалов. Указывает маршрут изделия (операции).
3. Создает Н\Н в продажах, связывает ном номера.
4. После этого Пользователь задает математические формулы для расчеты материалов (в текстовом файле с именем, который является кодом спецификации) и из реестра спецификаций вызывает спецфункцию "Задать формулы расчета". После этого формулы берутся из .txt файла, проверяются на синтаксис Б-5.
5.Задает количество переменных в формулах, наименования параметров, допустимые пределы.
6. Формулы переписываются в отдельную таблицу, где и хранятся.
Затем, если ему необходимо изделие данного типа, опеределенных размеров, которого еще нет, он нажимает на кнопочку "создать". Вот она-то как раз и выполняет те 4ре дейтсвия, которые я описал.
Для этого Спецфункция открывает таблицу с формулами, считает расход материалов, копирует номенклатурные номера, спецификацию, задавая лишь новые значения, названия и параметры.
Перед созданием идет еще и проверка на то, а не создано ли изделие таких размеров до этого.
Вот, наверное, вся задача. Хотя мог чего-то и забыть. Это сейчас есть, работает не самым лучшим образом (код можно оптимизировать и оптимизировать, да еще вдобавок он без классов), но уже работает.
З.Ы. Разумеется есть и действия как удалить формулы, проверить формулы, сделав тестовый расчет изделия в .txt файл, все сразу с ходу не опишу.
nordk пишет:
Тогда бы весь БЭСТ был покрыт семафорами.
InitList четко отслеживает уникальность по индексному ключу и перед записью не дает вам делать 2 одинаковые записи даже при работе 100 пользователей а не то что двух :))
С огромным удовльствием готов от них отказаться. Тогда подскажите как быть?
Действия:
1. Создаем Н\Н в sclad\Mlabel
2. Создаем Н\Н в zapas\Mlabel
3. Создаем Спецификацию на 2.
( Таблицы BOM, BOM_INV, BOP_OP)
4. Создаем сзвязь между 2 и 1( или тоже самое, что и Изменяем2).
Условие1:
Либо все 4ре действия выполняются, либо не выполняется ни одно из них.
Условие2:
Исключение одновременного выполнения действий 1-4 на разных машинах.
Есть спецфункция, создающая автоматически по запросу пользователя:
Номенклатурную единицу в отделе продаж, Номенклатурную единицу в производстве, спецификацию на неё и задаёт связь между двумя Н\Н. Н\Нра и код спецификации присваивается следующий по списку. В такой ситуации если 2 пользователя будут работать с этой спец-ей может получиться один и тот же номер (у чего-либо).
Здесь как раз было бы неплохо использовать семафор, сигнализирующий 2му пользователю о работе со спецфункцией.
(Вариант проверить перед записью существование номера мне кажется неподходящим)
В Mlabel торговли (\SCLAD) есть индекс TAG_RAZMER , UPPER(STATUS+RAZMER).
Поиском по нему не находится.
Например ищу строку:
" "+"100x100x100". Не находит.
Даже не работает такое:
Код
Goto 250//В отладчике поля 250й записи видны
stemp:=MLaBEL->STATUS+MLABEL->RAZMER
//Присвоилось " 100x100 "-26 символов.
DbPush("MLABEL","TAG_RAZMER","",{"UPPER(STATUS+RAZMER)",stemp,stemp})
После того как ставлю скоб - пусто. Устал биться. В чем проблема, подскажите, пожалуйста.
На своём предприятии столкнулся с такой проблемой:
Заказчик : - Надо написать программу.
Сис админ: - Какую, для чего?
З: - Чтобы производство учитывалось.
С: - А что нужно учитывать?
З: - Ну, чтобы всё работало!!!
Наверняка, с таким сталкиваются повсеместно. Выход - написание документов, в которых указано, что должно быть реализовано, в т.ч. и ТЗ. Честно говоря уже давно таким не занимался. Кто и как документально согласовывает с заказчиком, то, что ему нужно, чтобы потом не быть "крайним". Конкретно при работе с внедрением БЕСТ в производство.
Уверен, что целиком ТЗ детального как такового нет, не существует, но все же как-то подтверждает З чего он хочет. Как поступать, чем руководствоваться при написании таких документов, м\б, что-нибудь почитать?
Саак Шахламджян пишет:
Пример на старом форуме нашёл ( Считать данные из Excel'я ), но не получается даже "запустить" Exel :(
На oApp := CreateObject( "Excel.Application" ) ругань, что нет такой функции, явно упускаю что-то важное и простое из виду...
снят, нашёл пример для Б-5 (CreateObject в Б5).
Думается, вопросов будет больше по тому самому скриптовому языку VB (да и вообще по классу Excel.Application), там чистый VB? Можно, в принципе уже начинать искать описание синтаксиса этого языка и пользоваться ими или лучше все же дергать куски из примеров, приведенных на форумах?
Пример на старом форуме нашёл (Считать данные из Excel'я), но не получается даже "запустить" Exel :(
На oApp := CreateObject( "Excel.Application" ) ругань, что нет такой функции, явно упускаю что-то важное и простое из виду...
nordk пишет:
Ну да - тогда посмотрите как мы открываем и работаем с Exel на старом форуме есть пример.Потом по образцу и подобию трансформируйте макросы Excel в харбор...Когда непонятно что вернет та или иная запись ее можно пробовать в отладчике в командном окне - если не отрабатывает (некорректен синтаксис и т.п., то будет писать что не знаю такой объект - что-то типа)и еще для плагина не забудьте подключить excel.ch