Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Автоматическое создание папок из полей таблицы c помощью VBS (http://forum.oszone.net/showthread.php?t=210350)

NecroTYN 02-07-2011 19:41 1705783

Автоматическое создание папок из полей таблицы c помощью VBS
 
Здравствуйте Господа программисты!!!

Очень нужна ваша помощь в следующем вопросе:

Есть программа работающая с базой данных Access, включающая в себя следующие таблицы: ... Заказы,клиенты,продукты....

Нужно создать скрипт VBS чтобы при создании ЗАКАЗА автоматически создавалась группа папок в определенном месте диска (D:\Documents\Заказы\...), а имена этих папок создавались бы из определенных полей таблиц. Например:
после создания заказа должны появится папки по указанному пути с таким вот именем:
D:\Documents\Заказы\ул.Красная\Сергеев\
где ул.Красная это адрес клиента, Сергеев это Фамилия клиента,
В папке "Сергеев" в свою очередь создаются папки (Стойка компьютерная,Стол письменный,Шкаф купе), имена которых берутся из подтаблицы "продукты" (в которой мы собственно и составляем заказ), каждая из которых содержит в себе еще 4 папки с неизменными названиями(Замер,Модель,Раскрой,Эскизы,Документы)....

имя 1ой папки-берется из таблицы qdfOrders - Address
имя 2ой папки-берется из таблицы qdfMain - Client
имя 3ей папки-берется из таблицы tblOrdersProducts - Product

"третьих" папок должно создаваться столько, сколько заказано продуктов, за исключением услуг(которые кстати тоже находятся в таблице tblOrdersProducts), в каждой из них создаются следующие папки:

Замер
Модель
Раскрой
Эскизы
Документы



С нетерпением жду ответа

amel27 03-07-2011 09:38 1705961

Цитата:

Цитата NecroTYN
Нужно создать скрипт VBS чтобы при создании ЗАКАЗА автоматически создавалась группа папок »

Вы что-то путаете - написать VBS и обеспечить его автоматический запуск - две разные задачи, причем без решения второй первая не имеет смысла. AFAIK в базах данных подобный функционал реализуется триггерами, поэтому советую для начала погуглить на эту тему или задать вопрос в соответствующей ветке форума.

NecroTYN 03-07-2011 10:27 1705976

amel27,
Цитата:

Цитата amel27
обеспечить его автоматический запуск »

С этим то как раз все понятно, мне просто нужен скрипт,
Цитата:

Цитата amel27
поэтому советую для начала погуглить на эту тему »

Уже неделю гуглю, ничего не нашлось, потому и прошу помощи
Цитата:

Цитата amel27
подобный функционал реализуется триггерами »

Возможность такая есть

amel27 03-07-2011 11:17 1705995

Цитата:

Цитата NecroTYN
Возможность такая есть »

Реализация скрипта как раз зависит от механизма этой возможности, т.е. скрипт должен КАК-ТО подключаться к БД и КАК-ТО отличать вновь введённые записи от введенных ранее - в триггерах эта инфа передаётся скриптам в качестве параметров.

NecroTYN 03-07-2011 11:20 1705996

Вот скрины свойств полей , рис 4 триггеры
В поле триггер указываю файл скрипта,в поле"когда срабатывает"-- при добавлении записи, в поле "Тип операции"-- Запуск файла

amel27 03-07-2011 12:07 1706025

Цитата:

Цитата NecroTYN
В поле триггер указываю файл скрипта »

в таком случае должна быть возможность передачи требуемых значений полей (вновь введенных записей) средствами триггера в качестве параметров скрипта (я не знаток SQL, возможно потребуются дополнительные запросы к связанным таблицам, но должно быть достаточно одного триггера на таблицу продуктов), типа:
Код:

MakeDir.VBS qdfOrders.Address qdfMain.Client tblOrdersProducts.Product
MakeDir.VBS:
читать дальше »
Код:

Set FSO = CreateObject("Scripting.FileSystemObject")

strPath="C:\Documents"
If Not FSO.FolderExists(strPath) Then FSO.CreateFolder(strPath)
strPath=strPath & "\Заказы"
If Not FSO.FolderExists(strPath) Then FSO.CreateFolder(strPath)
strPath=strPath &"\"& WScript.Arguments(0)
If Not FSO.FolderExists(strPath) Then FSO.CreateFolder(strPath)
strPath=strPath &"\"& WScript.Arguments(1)
If Not FSO.FolderExists(strPath) Then FSO.CreateFolder(strPath)
strPath=strPath &"\"& WScript.Arguments(2)
If Not FSO.FolderExists(strPath) Then FSO.CreateFolder(strPath)


NecroTYN 03-07-2011 12:32 1706033

Сделал файл VBS, скопировал туда вышеприведенные коды, выдает такую

Uploaded with ImageShack.us

ferget 03-07-2011 14:33 1706083

вот это надо в bat-файл

Код:

MakeDir.VBS qdfOrders.Address qdfMain.Client tblOrdersProducts.Product

NecroTYN 03-07-2011 14:55 1706092

Цитата:

Цитата ferget
вот это надо в bat-файл »

Всеравно пишет ошибку:
Строка 6
Символ 1
Индекс выходит за пределы допустимого диапазона
Код 800А0009

Папки C:\Documents\аказы --создаются

ferget 03-07-2011 15:04 1706095

странно

выложите bat и vbs файлы

NecroTYN 03-07-2011 15:12 1706098

Вложений: 1
Цитата:

Цитата ferget
выложите bat и vbs файлы »

Вот выкладываю

ferget 03-07-2011 15:22 1706105

запускать нужно bat-файл

название vbs-файла должно быть makedir
или измените bat

Код:

CreatFolders.VBS tblOrders.Address tblMain.Client tblOrdersProducts.Product

NecroTYN 03-07-2011 15:30 1706108

Вложений: 1
Изменил название VBS получились следующие результаты

amel27 03-07-2011 15:34 1706110

гм... а при чем тут BAT?.. запуск должен производиться средствами СУБД
хотя, если движок сервера БД MSSQL, для запуска скриптов из SQL можно использовать xp_cmdshell

NecroTYN 03-07-2011 15:43 1706118

Цитата:

Цитата amel27
гм... а при чем тут BAT?.. запуск должен производиться средствами СУБД
хотя, если движок сервера БД MSSQL, для запуска скриптов из SQL можно использовать xp_cmdshell »

:o :dont-know
вот я и прошу помощи у знающих

amel27 03-07-2011 16:01 1706129

Цитата:

Цитата NecroTYN
прошу помощи у знающих »

знатоки SQL в другой ветке (см.пост #2)
тем более, что движок БД до сих пор неизвестен

NecroTYN 03-07-2011 16:30 1706140

Цитата:

Цитата amel27
тем более, что движок БД до сих пор неизвестен »

(СУБД MS Access или MS SQL Server)



вот родной скрипт для примера:
Код:

'данный код предназначен для демонстрационных целей
'вы можете писать на языке VBScript любые скрипты
'выполнение данного файла можно связать с нажатием пользовательской кнопки,
'которую можно добавить на панель инструментов любой таблицы или с помощью триггеров

Dim sDbPath 'путь к файлу БД
Dim sDateFrom 'дата от
Dim sDateTo 'дата до
Dim sMark 'метка, чтобы пометить записи для каких-то последующих целей

sDbPath = InputBox("Укажите путь к файлу .mdb", "Выбор файла", "DemoDatabase.mdb")
If sDbPath > "" Then
  sDateFrom = InputBox("Введите дату от, пример 31.12.2005", "Дата от")
  If Trim(sDateFrom) > "" then
    sDateTo = InputBox("Введите дату до, пример 31.12.2006", "Дата до")
    If Trim(sDateTo) > "" then
      sMark = InputBox("Введите метку", "Метка")
      If Trim(sMark) > "" Then
        Dim Con 'объект Connection
        Set Con = CreateObject("ADODB.Connection") 'создание объекта Connection
        Con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sDbPath & ";Persist Security Info=False" 'открываем соединение с базой данных

        Dim sAbsDateFrom, sAbsDateTo 'даты в абсолютном формате
        'sAbsDateFrom = Mid(sDateFrom, 7, 4) & "-" & Mid(sDateFrom, 4, 2) & "-" & Left(sDateFrom, 2) '"31.12.2005" -> "20051231"
        'sAbsDateTo = Mid(sDateTo, 7, 4) & "-" & Mid(sDateTo, 4, 2) & "-" & Left(sDateTo, 2) '"31.12.2006" -> "20061231"

        sAbsDateFrom = Mid(sDateFrom, 4, 2) & "/" & Left(sDateFrom, 2) & "/" & MID(sDateFrom, 7) '"31.12.2005" -> "20051231"
        sAbsDateTo = Mid(sDateTo, 4, 2) & "/" & Left(sDateTo, 2) & "/" & MID(sDateTo, 7) '"31.12.2005" -> "20051231"

        Dim sSql 'SQL инструкция
        sSql = "UPDATE tblMain SET Notes='" & sMark & "' WHERE AddTime > #" & sAbsDateFrom & "# AND AddTime < #" & sAbsDateTo & "#" 'формируем SQL инструкцию

        If MsgBox("Будет выполнена следующая SQL инструкция:" & vbCr & vbCr & sSql & vbCr & vbCr & "Продолжить?", vbYesNo+vbQuestion, "Подтверждение") = vbYes Then 'подтверждение
          Con.Execute sSql 'выполняем SQL инструкцию, которая изменяет данные в таблице

          If Err.Number = 0 Then
            MsgBox "Обновление таблицы прошло успешно.", vbInformation, "Ура!!!"
          End If
        End If

        Con.Close 'закрываем Connection
        Set Con = Nothing 'очищаем переменную
      End If
    End If
  End If
End if


NecroTYN 03-07-2011 18:07 1706171

Блин парни, дак вы мне тоже не поможете ???

amel27 03-07-2011 18:52 1706176

Цитата:

Цитата NecroTYN
СУБД MS Access или MS SQL Server »

триггеры будут работать только на MS SQL Server
Цитата:

Цитата NecroTYN
вот родной скрипт для примера:»

за скрипт спасибо (пусть будет)
но пользы от него мало - по описанным выше причинам
Цитата:

Цитата NecroTYN
дак вы мне тоже не поможете ??? »

а чего не хотите писать в профильную ветку?..
навскидку привести код триггера на SQL не готов - смогу скопипастить с сервера только завтра
если есть установленный MS SQL Server - смотрите BOL (SQL Server Books Online)

NecroTYN 03-07-2011 20:15 1706206

Цитата:

Цитата amel27
навскидку привести код триггера на SQL не готов »

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

amel27 04-07-2011 06:07 1706416

Цитата:

Цитата NecroTYN
написать файл-скрипт .VBS, который будет создавать папки в файловой системе, основываясь на переданные в него параметры »

Скрипт приведён в посте #6, но судя по ошибке параметры скрипту не передаются - либо это сделано неправильно, либо ПО это сделать не позволяет - требуется обратиться к мануалу или связаться с разработчиками. Вопрос о способе передачи параметров не связан со скриптами. Вот простой тестовый VBS-скрипт, который должен вывести сообщение со значением переданного параметра:
Код:

WScript.Echo WScript.Arguments(0)
В качестве альтернативы предлагаю создать триггер средствами ПО, затем средствами MS SQL проверить код созданного триггера на заданной таблице - при не обходимости этот код можно будет отредактировать. Вот пример, как может выглядеть код триггера для случая передачи (в батник) значения одного поля:
Код:

CREATE TRIGGER qdfOrders_INSERT
ON qdfOrders
AFTER INSERT AS
DECLARE @cmd sysname, @var sysname
SELECT @var=Address FROM inserted
SET @cmd='MD "C:\Documents\Заказы\' + @var + '"'
EXEC master..xp_cmdshell @cmd


NecroTYN 04-07-2011 08:55 1706459

Доброе утро amel27

Цитата:

Цитата amel27
Вот простой тестовый VBS-скрипт, который должен вывести сообщение со значением переданного параметра:
Код:
WScript.Echo WScript.Arguments(0) »

Блин!! Может я чет не правильно делаю, создал файл VBS, скопировал туда вышепривиденный код, a Windows Script Host все равно пишет ошибку --
строка 1
Символ 1
Ошибка: Индекс выходит за пределы допустимого диапазона Код 800А 0009

ferget 04-07-2011 09:11 1706465

вы ему параметр не передали

в командной строке напишите

test.vbs привет

NecroTYN 04-07-2011 09:14 1706466

Цитата:

Цитата ferget
вы ему параметр не передали »

Это как делается ???

amel27 04-07-2011 09:20 1706468

Цитата:

Цитата NecroTYN
Windows Script Host все равно пишет ошибку »

чтобы понять смысл ошибки, запустите тестовый VBS с параметром и без:
Код:

TEST.VBS 123
Код:

TEST.VBS

NecroTYN 04-07-2011 09:20 1706469

Вложений: 1
вот скрин

ferget 04-07-2011 09:22 1706470

напишите

test.vbs привет

NecroTYN 04-07-2011 09:26 1706471

Вложений: 1
Цитата:

Цитата ferget
напишите
test.vbs привет »

написал TEST.VBS 123

вот скрин

ferget 04-07-2011 09:51 1706481

Цитата:

Цитата NecroTYN
Есть программа работающая с базой данных Access, включающая в себя следующие таблицы: ... Заказы,клиенты,продукты.... »

а как называется программа?

NecroTYN 04-07-2011 09:59 1706484

Цитата:

Цитата ferget
а как называется программа? »

Учет Клиентов

Конечно я просил у них поддержки, вот что ответили:
Цитата:

Вам надо написать файл-скрипт .VBS, который будет создавать папки в файловой системе, основываясь на переданные в него параметры.
Подробности - типовой вопрос №14
Далее нужно задать триггер на добавление на таблицу "Заказы", но в качестве команды указать не SQL-инструкцию, а запуск данного файла.
и сделают за отдельные деньги

Вот еще вопрос: а скрипт должен лежать с рядом с базой данных или как ???

NecroTYN 04-07-2011 10:21 1706497

Вложений: 1
Вот скрин каталогов, которые создаются при запуске bat

amel27 04-07-2011 11:11 1706521

Цитата:

Цитата NecroTYN
сделают за отдельные деньги »

Скорее всего это псевдо-триггер, который реализован не движком базы данных, а кодом программы - поэтому без разработчиков тут и шагу не сделать. Единственный выход - переводить базу на SQL Server и создавать свои триггеры.

Цитата:

Цитата NecroTYN
скрин каталогов, которые создаются при запуске »

параметры передаются как надо, а вот как вместо имен полей передать их значения - это вопрос уже к разработчикам и не факт что это возможно

NecroTYN 04-07-2011 15:35 1706674

amel27

Вот что мне ответили на соседнем форуме по поводу нашего кода:


Цитата:

2-е: 100% могу сказать что работает он с таким результатом:
<\Documents\ (0)>
+-<\Documents\Заказы\ (0)>
+-<\Documents\Заказы\qdfOrders.Address\ (0)>
+-<\Documents\Заказы\qdfOrders.Address\qdfMain.Client\ (0)>
+-<\Documents\Заказы\qdfOrders.Address\qdfMain.Client\tblOrdersProducts.Product\ (0)
т.е. делает точно то, что ты ему задал — имена папок.

Цитата:

VBS сам по себе не полезет в вашу БД и не будет считывать оттуда значения полей
Цитата:

Ну и всё верно - получено ровно то, что написано кодом. Какие проблемы? Если не понимаете, почему получается именно так - возьмите лист бумаги и пройдите по всем строкам своей программы, записывая, как по мере её выполнения изменяется содержимое переменной strPath. А заодно поймёте, что надо изменить...

amel27 04-07-2011 15:51 1706687

Цитата:

Цитата NecroTYN
по поводу нашего кода »

повторюсь (в очередной раз) - проблема не в коде, а в его интеграции с конкретной программой

Синхронный запуск скрипта - это лишь половина проблемы. Вторая половина - получить эти самые (вновь введенные) данные: либо программа должна уметь их передавать в скрипт (через параметры), либо скрипт должен как-то (?) сам отбирать эти данные из таблиц (среди остальных)

NecroTYN 04-07-2011 16:02 1706696

Цитата:

Цитата amel27
повторюсь (в очередной раз) - проблема не в коде, а в его интеграции с конкретной программой »

Вот что мне ответили разработчики:
Цитата:

Можно передать в файл-скрипт параметр - значение любого поля текущей записи (например, поля "ID" или поля "Полный путь к файл" или поля "Папка"). Откройте файл ScriptExample3.vbs в Блокноте и посмотрите конкретный пример. Чтобы указать поле, нужно написать его внутреннее имя в квадратных скобках.
Вот содержание ScriptExample3.vbs
Код:

данный код предназначен для демонстрационных целей
'вы можете писать на языке VBScript любые скрипты
'выполнение данного файла можно связать с нажатием пользовательской кнопки,
'которую можно добавить на панель инструментов любой таблицы в программе
'данный скрипт читает парамеры командной строки, с которой он был вызван
'например, если вызов был такой "C:\ScriptExample3.vbs /1 /2", то скрипт покажет "1" и "2"

Dim objArgs 'объекта для чтения параметров строки запуска файла
Dim sMsg 'текст сообщения
Dim i 'числовая переменная для цикла

Set objArgs = WScript.Arguments 'получение объекта для чтения параметров строки запуска файла

sMsg = "Всего параметров = " & objArgs.Count & vbCr

For i = 0 To objArgs.Count - 1
  sMsg = sMsg & "Параметр " & i + 1 & " = " & objArgs(i) & vbCr
Next

MsgBox sMsg, vbInformation, "Сообщение" 'показываем собщение


amel27 04-07-2011 16:18 1706710

Цитата:

Цитата NecroTYN
содержание ScriptExample3.vbs »

тот же TEST.VBS только для нескольких параметров

Цитата:

Цитата NecroTYN
Чтобы указать поле, нужно написать его внутреннее имя в квадратных скобках. »

ну дык проверили бы уже - вызвать из программы этот или TEST.VBS в триггере
скажем, что вернет (имя поля или значение) для таблицы qdfOrders и поля Address:
Код:

TEST.VBS [Address]

NecroTYN 04-07-2011 16:55 1706735

Вот еще советы с приветливого форума:
Цитата:

Но вот вам направление: написать скрипт который только определяет количество переданных параметров и сохраняет их в текстовый файл и «задать триггер на добавление на таблицу "Заказы", но в качестве команды указать не SQL-инструкцию, а запуск данного файла.» (это уже в програме/БД) А далее тупо смотреть (анализировать ), что в скрипт передаётся
Цитата:

Я думаю, кое-какие операции следует с этой переменной проделывать после создания каждой новой папки.

amel27 05-07-2011 09:01 1707168

NecroTYN, пример VBS на дабавление/изменение таблицы заказов:
Код:

C:\TEST\Script.vbs /[ID]
читать дальше »
Код:

Dim sDbPath 'путь к файлу БД
sDbPath = CreateObject("Wscript.Shell").SpecialFolders("MyDocuments") & "\Учет клиентов\DemoDatabase.mdb"

Dim Con 'объект Connection
Set Con = CreateObject("ADODB.Connection") 'создание объекта Connection
Con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sDbPath & ";Persist Security Info=False" 'открываем соединение с базой данных

Dim sSql 'SQL инструкция
sSql = "SELECT o.Address,m.Client,op.Product FROM tblOrdersProducts op,tblOrders o,tblMain m WHERE m.ID=o.ClientID AND o.ID=op.OrderID AND op.ID="& Mid(WScript.Arguments(0),2)
Set oRec = Con.Execute(sSql)  'выполняем SQL инструкцию

Dim FSO 'объект FileSystemObject
Set FSO = CreateObject("Scripting.FileSystemObject")

Dim strPath 'путь к папке
strPath="C:\Documents"
If Not FSO.FolderExists(strPath) Then FSO.CreateFolder(strPath)
strPath=strPath & "\Заказы"
If Not FSO.FolderExists(strPath) Then FSO.CreateFolder(strPath)
strPath=strPath &"\"& Replace(oRec.Fields(0).Value,"""","")
If Not FSO.FolderExists(strPath) Then FSO.CreateFolder(strPath)
strPath=strPath &"\"& Replace(oRec.Fields(1).Value,"""","")
If Not FSO.FolderExists(strPath) Then FSO.CreateFolder(strPath)
strPath=strPath &"\"& Replace(oRec.Fields(2).Value,"""","")
If Not FSO.FolderExists(strPath) Then FSO.CreateFolder(strPath)

Con.Close 'закрываем Connection
Set Con = Nothing 'очищаем переменную



P.S. критерий разделения услуг/товара в топике не раскрыт

NecroTYN 05-07-2011 10:39 1707224

опять ругается, пишет вот как

amel27 05-07-2011 10:54 1707240

Цитата:

Цитата NecroTYN
пишет вот как »

ну сами хоть чуть подумайте - смысл ошибки тот же, номер строки в ошибке указан, примеры для экспериментов были выше - очевидно скрипт запускается без параметров


скрипт строит структуру каталогов по переданному ID из заказанного

NecroTYN 06-07-2011 09:10 1708024

amel27,
Спасибо, все заработало

NecroTYN 10-07-2011 20:24 1710761

ВСЕМ Привет!!!

Цитата:

Цитата amel27
P.S. критерий разделения услуг/товара в топике не раскрыт »

Раскрываю критерий разделения услуг/товара:
Все товары и услуги находятся в таблице tblOrdersProducts и делятся на категории - товары и услуги (поле ProductsCategoryCalc), так вот, нужно сделать выборку чтобы папки не создавались на категорию "УСЛУГИ"

amel27 11-07-2011 07:45 1710934

Цитата:

Цитата NecroTYN
поле ProductsCategoryCalc »

Нет такого поля в таблице tblOrdersProducts - откройте базу данных в MS Access и убедитесь в этом, а суффикс CALC говорит о том, что это поле (скорее всего) рассчетное. Тип товара есть в tblProducts и я не вижу никаких идентификаторов для связи с tblOrdersProducts кроме наименования товара, но оно не является уникальным со всеми вытекающими последствиями.

NecroTYN 11-07-2011 10:19 1711007

Цитата:

Цитата amel27
Нет такого поля в таблице tblOrdersProducts »

Цитата:

Цитата amel27
а суффикс CALC говорит о том, что это поле (скорее всего) рассчетное »

это то все правильно говорите, я его сам туда назначил из таблицы tblProducts, так не получится ????

NecroTYN 11-07-2011 10:48 1711028

Цитата:

Цитата amel27
Нет такого поля в таблице tblOrdersProducts »

...Ну а если путем перечисления "услуг" -- их всего то 5...

amel27 11-07-2011 11:05 1711039

Цитата:

Цитата NecroTYN
я его сам туда назначил из таблицы tblProducts, так не получится ???? »

Цитата:

Цитата NecroTYN
а если путем перечисления "услуг" -- их всего то 5... »

да мне в общем-то всё равно - вам решать, можно и по наименованию сравнить... только ни один из этих способов не является идеальным, так что сначала взвесьте все "за" и "против", с расчетом "на перспективу"

NecroTYN 11-07-2011 11:08 1711042

Цитата:

Цитата amel27
только ни один из этих способов не является идеальным »

а какой есть идеальный ???

Цитата:

Цитата amel27
так что сначала взвесьте все "за" и "против", с расчетом "на перспективу" »

...ну а ВЫ что посоветуете ???

Хотя наверное по категории будет всетаки лучше, потому что услуг может и добавиться

amel27 11-07-2011 12:34 1711112

Цитата:

Цитата NecroTYN
какой есть идеальный ??? »

нормализованный, когда в таблицах стоит ID из справочника (tblProducts), а не имя
Цитата:

Цитата NecroTYN
а ВЫ что посоветуете ??? »

Ваша база данных, вам и решать... ;)
вариант с именем, имя продукта должно быть уникальным и присутствовать в справочнике:
читать дальше »
Код:

Dim sDbPath 'путь к файлу БД
sDbPath = CreateObject("Wscript.Shell").SpecialFolders("MyDocuments") & "\Учет клиентов\DemoDatabase.mdb"

Dim Con 'объект Connection
Set Con = CreateObject("ADODB.Connection") 'создание объекта Connection
Con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sDbPath & ";Persist Security Info=False" 'открываем соединение с базой данных

Dim sSql 'SQL инструкция
sSql = "SELECT Top 1 p.ProductType FROM tblOrdersProducts op,tblProducts p WHERE op.Product=p.ProductName AND op.ID="& Mid(WScript.Arguments(0),2)
Set oRec = Con.Execute(sSql)  'выполняем SQL инструкцию
If oRec.EOF Then WScript.Quit 'если продукта нет в справочнике, то выход

sType = oRec.Fields(0).Value  'тип товара
If Left(sType,6)="Услуга" Then WScript.Quit 'если Услуга, то выход

sSql = "SELECT o.Address,m.Client,op.Product FROM tblOrdersProducts op,tblOrders o,tblMain m WHERE m.ID=o.ClientID AND o.ID=op.OrderID AND op.ID="& Mid(WScript.Arguments(0),2)
Set oRec = Con.Execute(sSql)  'выполняем SQL инструкцию

Dim FSO 'объект FileSystemObject
Set FSO = CreateObject("Scripting.FileSystemObject")

Dim strPath 'путь к папке
strPath="C:\Documents"
If Not FSO.FolderExists(strPath) Then FSO.CreateFolder(strPath)
strPath=strPath & "\Заказы"
If Not FSO.FolderExists(strPath) Then FSO.CreateFolder(strPath)
strPath=strPath &"\"& Replace(oRec.Fields(0).Value,"""","")
If Not FSO.FolderExists(strPath) Then FSO.CreateFolder(strPath)
strPath=strPath &"\"& Replace(oRec.Fields(1).Value,"""","")
If Not FSO.FolderExists(strPath) Then FSO.CreateFolder(strPath)
strPath=strPath &"\"& Replace(oRec.Fields(2).Value,"""","")
If Not FSO.FolderExists(strPath) Then FSO.CreateFolder(strPath)

Con.Close 'закрываем Connection
Set Con = Nothing 'очищаем переменную


P.S. Сравнение идет с учетом регистра: "Услуга"<>"УСЛУГА"

Iska 11-07-2011 16:52 1711328

Цитата:

Цитата NecroTYN
а какой есть идеальный ??? »

Идеальных не бывает. На практике обычно считается достаточным, если таблицы базы нормализованы в соответствии с нормальной форме Бойса — Кодда.
Цитата:

Цитата amel27
нормализованный, »

Поставил бы три благодарности, кабы можно было.

NecroTYN 11-07-2011 18:32 1711396

---------------------------
Windows Script Host
---------------------------
Сценарий: C:\Program Files (x86)\ClientsCount\makedir.vbs
Строка: 9
Символ: 1
Ошибка: Индекс выходит за пределы допустимого диапазона
Код: 800A0009
Источник: Ошибка выполнения Microsoft VBScript

---------------------------
ОК
---------------------------

NecroTYN 11-07-2011 23:11 1711544

......... вот блин, перепробовал все до чего смог додуматься, так ниче и не получилось больше, даже тест.вбс не запустился.... :help:

amel27 12-07-2011 04:55 1711629

Цитата:

Цитата NecroTYN
Ошибка: Индекс выходит за пределы допустимого диапазона »

1. Убедитесь, что параметр (ID) передаётся в скрипт через слэш (пост #38);
2. Проверить работу скрипта можно, передав ID реальной записи из tblOrdersProducts:
Код:

C:\TEST\Script.vbs /37
3. Триггер должен запускать скрипт ПОСЛЕ создания/изменения записи.

NecroTYN 12-07-2011 19:11 1712003

Цитата:

Цитата amel27
1. Убедитесь, что параметр (ID) передаётся в скрипт через слэш (пост #38);
2. Проверить работу скрипта можно, передав ID реальной записи из tblOrdersProducts »

Вот мои действия:
1.создал bat файл --
Код:

c:\Program Files (x86)\ClientsCount\makedir.vbs / [5]
2.создал makedir.vbs c с указанным вами кодом по пути c:\Program Files (x86)\ClientsCount
3.в программе в "триггерах" указал запуск bat -- после добавления/изменения
4.в программе в "триггерах" указал запуск makedir.vbs -- после добавления/изменения

результат тот же:
читать дальше »


---------------------------
Windows Script Host
---------------------------
Сценарий: C:\Program Files (x86)\ClientsCount\makedir.vbs
Строка: 9
Символ: 1
Ошибка: Индекс выходит за пределы допустимого диапазона
Код: 800A0009
Источник: Ошибка выполнения Microsoft VBScript

---------------------------
ОК
---------------------------

поправил bat на
Код:

makedir.vbs / [5]
результат следующий:
читать дальше »

1.
---------------------------
Windows Script Host
---------------------------
Сценарий: C:\Program Files (x86)\ClientsCount\makedir.vbs
Строка: 9
Символ: 1
Ошибка: Индекс выходит за пределы допустимого диапазона
Код: 800A0009
Источник: Ошибка выполнения Microsoft VBScript

---------------------------
ОК
---------------------------
2.
---------------------------
Windows Script Host
---------------------------
Сценарий: C:\Program Files (x86)\ClientsCount\makedir.vbs
Строка: 10
Символ: 1
Ошибка: Отсутствует значение для одного или нескольких требуемых параметров.
Код: 80040E10
Источник: Microsoft JET Database Engine

---------------------------
ОК
---------------------------


Если убрать квадратные скобки в батнике -- выскакивает первая ошибка

NecroTYN 12-07-2011 23:33 1712164

.......... НННННда !!!!!!!!!! Не прошло и ШЕСТИ страниц как до меня дошло, что сам VBS запускать не надо
Простите уж тупицу :sorry:

Вопрос о передаче параметров скрипту тоже решился, В триггерах при запуске файла надо указать так: C:\Program Files (x86)\ClientsCount\makedir.vbs /[ID] и все работает нормано
По поводу скрипта еще пара вопросов,

как сделать проверку создаваемых папок ?
как в папке с адресом клиента создать папку документы ?
как в папке с именем товара создать папки Замер Модель Раскрой Эскизы ?
как правильно прописать путь создания папок (возможно к серверу) ?

...и еще такой момент, я писал:
Цитата:

Цитата NecroTYN
имя 1ой папки-берется из таблицы qdfOrders - Address
имя 2ой папки-берется из таблицы qdfMain - Client
имя 3ей папки-берется из таблицы tblOrdersProducts - Product »

а как сделать чтоб имя первой папки --Клиент, а второй --Адресс ???

amel27 13-07-2011 11:42 1712382

Цитата:

Цитата NecroTYN
как сделать проверку создаваемых папок ? »

какую проверку?
Цитата:

Цитата NecroTYN
как правильно прописать путь создания папок (возможно к серверу) ? »

давайте конкретные примеры расположения папок
Цитата:

Цитата NecroTYN
как в папке с адресом клиента создать папку документы ?
как в папке с именем товара создать папки Замер Модель Раскрой Эскизы ?
...и еще такой момент, я писал:
Цитата NecroTYN:
имя 1ой папки-берется из таблицы qdfOrders - Address
имя 2ой папки-берется из таблицы qdfMain - Client
имя 3ей папки-берется из таблицы tblOrdersProducts - Product »
а как сделать чтоб имя первой папки --Клиент, а второй --Адресс ??? »

заменить блок, отвечающий за создание каталогов на код:
читать дальше »
Код:

Dim strPath 'путь к папке
strPath="C:\Documents"
If Not FSO.FolderExists(strPath) Then FSO.CreateFolder(strPath)
strPath=strPath &"\Заказы"
If Not FSO.FolderExists(strPath) Then FSO.CreateFolder(strPath)
strPath=strPath &"\"& Replace(oRec.Fields(1).Value,"""","")
If Not FSO.FolderExists(strPath) Then FSO.CreateFolder(strPath)
strPath=strPath &"\"& Replace(oRec.Fields(0).Value,"""","")
If Not FSO.FolderExists(strPath) Then FSO.CreateFolder(strPath)
strTemp=strPath &"\Документы"
If Not FSO.FolderExists(strTemp) Then FSO.CreateFolder(strTemp)
strPath=strPath &"\"& Replace(oRec.Fields(2).Value,"""","")
If Not FSO.FolderExists(strPath) Then FSO.CreateFolder(strPath)
strTemp=strPath &"\Замер"
If Not FSO.FolderExists(strTemp) Then FSO.CreateFolder(strTemp)
strTemp=strPath &"\Модель"
If Not FSO.FolderExists(strTemp) Then FSO.CreateFolder(strTemp)
strTemp=strPath &"\Раскрой"
If Not FSO.FolderExists(strTemp) Then FSO.CreateFolder(strTemp)
strTemp=strPath &"\Эскизы"
If Not FSO.FolderExists(strTemp) Then FSO.CreateFolder(strTemp)


NecroTYN 13-07-2011 22:10 1712749

Цитата:

Цитата amel27
какую проверку? »

Снимаю вопрос
Цитата:

Цитата amel27
давайте конкретные примеры расположения папок »

Да в том то и дело что их пока нет, вот решаем, на сервер выложить или сетевой диск поставить, пока наверное как есть останется....

NecroTYN 14-07-2011 00:28 1712840

Цитата:

Цитата amel27
заменить блок, отвечающий за создание каталогов на код: »

Пока все работает !!!! СПАСИБО !!!

P.S. А еще можно будет обратиться за помощью ???

amel27 14-07-2011 09:29 1712983

Цитата:

Цитата NecroTYN
можно будет обратиться за помощью ? »

с чего вдруг возник такой вопрос?.. вроде для этого форум и существует


Цитата:

Цитата NecroTYN
вот решаем, на сервер выложить или сетевой диск поставить, пока наверное как есть останется.... »

учитывая, что в ACCESS-варианте скрипт запускается с клиента, желательно держать эту папку на одном сервере с базой данных (из соображений целостности данных), идеальный вариант - терминальный доступ (если поддерживается программой).

NecroTYN 14-07-2011 20:13 1713509

Цитата:

Цитата amel27
с чего вдруг возник такой вопрос?.. вроде для этого форум и существует »

Боюсь показаться назойливым....
Цитата:

Цитата amel27
учитывая, что в ACCESS-варианте... »

За совет спасибо огромное


:up :oszone:


Время: 18:15.

Время: 18:15.
© OSzone.net 2001-