PDA

Показать полную графическую версию : [решено] Автоматическое создание папок из полей таблицы c помощью VBS


Страниц : 1 [2] 3

amel27
04-07-2011, 06:07
написать файл-скрипт .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
Доброе утро amel27

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

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

ferget
04-07-2011, 09:11
вы ему параметр не передали

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

test.vbs привет

NecroTYN
04-07-2011, 09:14
вы ему параметр не передали »
Это как делается ???

amel27
04-07-2011, 09:20
Windows Script Host все равно пишет ошибку »чтобы понять смысл ошибки, запустите тестовый VBS с параметром и без:TEST.VBS 123TEST.VBS

NecroTYN
04-07-2011, 09:20
вот скрин

ferget
04-07-2011, 09:22
напишите

test.vbs привет

NecroTYN
04-07-2011, 09:26
напишите
test.vbs привет »

написал TEST.VBS 123

вот скрин

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

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

NecroTYN
04-07-2011, 09:59
а как называется программа? »

Учет Клиентов (http://www.simple-soft.ru/ClientsCount.htm)

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

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

NecroTYN
04-07-2011, 10:21
Вот скрин каталогов, которые создаются при запуске bat

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

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

NecroTYN
04-07-2011, 15:35
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
по поводу нашего кода »повторюсь (в очередной раз) - проблема не в коде, а в его интеграции с конкретной программой

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

NecroTYN
04-07-2011, 16:02
повторюсь (в очередной раз) - проблема не в коде, а в его интеграции с конкретной программой »

Вот что мне ответили разработчики:
Можно передать в файл-скрипт параметр - значение любого поля текущей записи (например, поля "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
содержание ScriptExample3.vbs »тот же TEST.VBS только для нескольких параметров

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

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

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

amel27
05-07-2011, 09:01
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
опять ругается, пишет вот как

amel27
05-07-2011, 10:54
пишет вот как »ну сами хоть чуть подумайте - смысл ошибки тот же, номер строки в ошибке указан, примеры для экспериментов были выше - очевидно скрипт запускается без параметров

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




© OSzone.net 2001-2012