Недавно возникла потребность печатать документы для индивидуального предпринимателя - школы иностранных языков. Программ с таким бедным функционалам не существует в природе, поэтому я взялся за разработку РМК администратора школы иностранных языков.
Конечно ни автоматизации, ни интеграции с каким - либо нет и не предусматривается. Это печаталка товарных чеков фактически.
В качестве чпу (чекопечаующее устройство) используется не фискальный Штрих мини-ФРК. Если поставить фискальный, то придется переделать немного печатную форму. Подключение к принтеру происходит через ActiveX драйвер, который есть у производителя на сайте.
On Error Resume Next
Set Shtrih = CreateObject("AddIn.DrvFR") ' Компонент драйвера для штриха. На системах х64 надо пускать через syswow64
Set WshShell = CreateObject("WScript.Shell") ' Подключаемся к шелу операционки
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(WshShell.CurrentDirectory) ' Определение рабочей папки
Set objFolderItem = objFolder.Self
Set objFSO = CreateObject("Scripting.FileSystemObject") ' Подключаемся к файловой системе
Set wo = WScript.CreateObject("Scripting.WindowSystemObject") ' Подключаем интерфйес
'Объявление констант
public CliName
public Wname
public Sumcash
public PayMonth
public Path
'____________________________
Path = objFolderItem.Path +""
LogFilePath=Path+"Cheqe.csv" ' Файл для сохранения операций, тестовый с разделителями. Открывается в эхселе
LogFilePath2=Path+"main.crc" ' Дубликат операций. По замыслу, для защиты информации типа.
set l1=objFSO.getfile (LogFilePath)
set l2=objFSO.getfile (LogFilePath2)
if l1.size<>l2.size then ' Сравнили размеры двух файлов и предупредили строго
msgbox "Контрольные суммы файлов базы данных не совпали, сообщите об этом кому надо",vbCritical, "Внимание, произошло страшное!"
End if
Shtrih.connect() ' Пробуем зацепиться к принтеру. Настройки подключения хранятся в программе "Тест драйвера"
wo.EnableVisualStyles = true
set mform = wo.CreateDialogForm(0,0,0,0, wo.Translate("WS_THICKFRAME")) ' Окно с программой. Без кнопок в заголовке
mform.ClientWidth =370
mform.ClientHeight = 430
mform.CenterControl()
mform.text="Печать кассового ордера"
mform.MaximizeBox=false
mform.MinimizeBox=true
mform.SizeGrip=false
mform.icon="icon.ico" ' иконка окна
mform.OnCloseQuery = GetRef("FormCloseQuery") ' Отрабатываем реакцию на закрытие
set R = mform.CreateReBar(0,0,0,0)
set M = R.CreateMenuBar(0,0,0,0) ' Создаем менюху
set t = M.Menu.Add("Файл")
set y = M.Menu.Add("Отчеты")
set v = M.Menu.Add("Помощь")
t.Add("Печать ","ENTER").OnExecute =GetRef("printC") ' Печатаем чек
t.Add("Печать копии чека ","F4").OnExecute =GetRef("printCC") ' Копия
y.Add("Отчет без гашения","F9").OnExecute =GetRef("printX") ' Отчет Х
y.Add("Отчет с гашением","F12").OnExecute = GetRef("printZ") ' Отчет Z
t.Add("-")
t.Add("Выход","ESC").OnExecute = GetRef("CloseForm") ' Окно можно закрыть только этой командой
v.Add("Инструкция","F1").OnExecute = GetRef("OHelp")
v.Add("-")
v.Add("О програме","").OnExecute = GetRef("OAbout")
set StatusBar = mform.CreateStatusBar() ' Статусбар внизу окна
StatusBar.Add(200).AutoSize = true
mform.TextOut 10,200,"* - поля, обязательные для заполнения" ' Надписи в окне
Shtrih.GetShortECRStatus ' Опрашиваем принтер
StatusBar.text=Shtrih.ECRModeDescription
if Shtrih.ReceiptRibbonIsPresent=false then msgbox "Недостаточно бумаги",vbCritical, "Внимание"
if Shtrih.ECRMode=0 then StatusBar.text="Принтер чеков не доступен"
mform.DrawImage 10,220,400,200,Path+"logo.bmp" ' Логотип организации внизу окна
mform.TextOut 10,30,"Выберите преподавателя:"
set ComboBox1 = mform.CreateComboBox(10,50,150,25) ' Список преподавателей
with (ComboBox1)
.Add("Ку*******ая Т.А")
.Add("Ря*****нко О.А.")
.Add("Ле****ва Е.В.")
.Add("Ст*****ая О.В")
.Add("Лы****ко Н.В.")
.Add("Ц*****а А.А.")
.Add("Ма*****ва О.В")
.Add("Со*****а В.Ю.")
.Add("Те******ка П.В.")
end with
ComboBox1.text="Ку*****ая Т.А" ' Значение по умолчанию
ComboBox1.ReadOnly=true
set tx1=mform.TextOut( 200,30,"* Сумма оплаты:")
tx1.Font.Size=14
set Edit1 = mform.CreateEdit(200,60,160,25) ' Поле ввода суммы оплаты
Edit1.DataType=2 ' Тип данных - целые числа
edit1.Max=10000
Edit1.text="1000"
Edit1.Font.Size=20
Edit1.OnClick=GetRef("SelAll") ' Выделение всего что введено при клике в поле
set tx2=mform.TextOut( 10,130,"* Фамилия, имя, отчество учащегося:")
tx2.Font.Size=14
set Edit2 = mform.CreateEdit(10,160,350,25)
Edit2.Font.Size=16
Edit2.SetFocus
mform.TextOut 10,80,"Выберите месяц:" ' Выбор месяца. Без лишних заморочек)
set ComboBox2 = mform.CreateComboBox(10,100,150,25)
ComboBox2.ReadOnly=true
with (ComboBox2)
.Add("сентябрь")
.Add("октябрь")
.Add("ноябрь")
.Add("декабрь")
.Add("январь")
.Add("февраль")
.Add("март")
.Add("апрель")
.Add("май")
.Add("июнь")
.Add("июль")
.Add("август")
end with
ComboBox2.text="октябрь"
mform.Show() ' Отображаем окошко
wo.Run()
sub printCC ' Заполняем параметры для копии чека и пишем лог
CliName=Edit2.text
Sumcash=Edit1.text
Wname=ComboBox1.text
PayMonth=ComboBox2.text
call printCopy (CliName,Wname,Sumcash,PayMonth)
Shtrih.GetShortECRStatus
StatusBar.text=Shtrih.ECRModeDescription
log Cstr(now)+";"+CliName+";"+Sumcash+";"+PayMonth+";"+Wname+";Напечатана копия чека"
end sub
sub CloseForm
mform.Close()
end sub
sub SelAll ' Выделяем
Edit1.SelectAll ()
end sub
sub OHelp()
end sub
sub printZ() ' Отчет с гашением
Shtrih.GetShortECRStatus
if Shtrih.ECRMode=4 then ' Проверяем, статус смены
StatusBar.text="Смена уже закрыта"
exit sub
end if
i=Inputbox("Введите пароль директора:","Пароль меняется каждый день") ' Тут типа динамический пароль, номер дня+номер месяца
d=day(now)
m=Month(Now)
p=Cstr(d+m)
if i<>p then
StatusBar.text="Не верный пароль директора"
log Cstr(now)+";"+CliName+";"+Sumcash+";"+PayMonth+";"+Wname+";Не верный пароль директора"
log Cstr(now)+";"+CliName+";"+Sumcash+";"+PayMonth+";"+Wname+";Не верный пароль директора"
exit sub
end if
Shtrih.FirstLineNumber=1
Shtrih.LastLineNumber=255
Shtrih.Draw() ' Печать логотипа организации на чеке
Shtrih.PrintReportWithCleaning() ' Печать отчета с гашением
wscript.sleep 1500 ' Ждем пока раступиться
Shtrih.GetShortECRStatus
StatusBar.text=Shtrih.ECRModeDescription ' Выводим в статусбар результат
log Cstr(now)+";"+CliName+";"+Sumcash+";"+PayMonth+";"+Wname+";Смена закрыта"
end sub
sub printX() ' Отчет без гашения.
Shtrih.FirstLineNumber=1
Shtrih.LastLineNumber=255
Shtrih.Draw()
Shtrih.PrintReportWithoutCleaning()
Shtrih.GetShortECRStatus
StatusBar.text=Shtrih.ECRModeDescription
log Cstr(now)+";"+CliName+";"+Sumcash+";"+PayMonth+";"+Wname+";Снят отчет без гашения"
end sub
sub printC() ' Печать чека
CliName=Edit2.text
Sumcash=Edit1.text
Wname=ComboBox1.text
PayMonth=ComboBox2.text
if CliName="" then ' Несколько проверок на корректной введенных данных
StatusBar.text="Не указана фамилия клиента"
exit sub
end if
if Len(CliName)<9 then
StatusBar.text="Введите инициалы полностью"
exit sub
end if
FioArr=Split(CliName," ")
if UBound(FioArr)<1 then ' Имя и фамилия - два слова через пробел
StatusBar.text="Введите инициалы полностью"
exit sub
end if
if Sumcash="0" then
StatusBar.text="Не указана сумма"
exit sub
end if
if Clng(Sumcash)<400 then
StatusBar.text="Введите сумму побольше"
exit sub
end if
call printCHQ(CliName,Wname,Sumcash,PayMonth) ' Вызываем процедуру печати чека
StatusBar.text="Чек напечатан"
wscript.sleep 1500 ' Тупим полторы секунды
Shtrih.FirstLineNumber=1
Shtrih.LastLineNumber=200
Shtrih.Draw() ' Логотип не забываем
Shtrih.StringForPrinting=" КОПИЯ"
Shtrih.PrintWideString()
Shtrih.RepeatDocument ' Печатаем копию чека
log Cstr(now)+";"+CliName+";"+Sumcash+";"+PayMonth+";"+Wname+";Напечатан чек"
Shtrih.GetShortECRStatus
StatusBar.text=Shtrih.ResultCodeDescription
If Err.Number <> 0 Then
StatusBar.text=Err.Description
End If
Edit2.text=""
end sub
sub OAbout ' Окно "о программе"
set Afrm = wo.CreateDialogForm(0,0,0,0)
Afrm.Text="О программе"
Afrm.ClientWidth =300
Afrm.ClientHeight = 100
Afrm.icon="cypher.ico" ' иконка окна
Afrm.CenterControl()
Shtrih.GetShortECRStatus
Status1=Shtrih.ResultCodeDescription
Status2=Shtrih.ECRModeDescription
set Atx=Afrm.TextOut(10, 10, "Печать приходный кассовых ордеров"+vbCrlf+Status1+vbCrlf+Status2+vbCrlf+"Разработка и поддержка:")
Afrm.CreateHyperLink 10,65,300,50, "http://skywalkeradmin.ru", ""
Afrm.ShowModal()
end sub
sub printCHQ(CliName,Wname,Sumcash,PayMonth) ' Печать чека
Shtrih.OpenCheck() ' Открывает чек и смену (если смена закрыта)
Shtrih.CheckType=1 ' наличный чек
Shtrih.StringForPrinting="ПРИХОДНЫЙ КАССОВЫЙ ОРДЕР"
Shtrih.PrintWideString() ' Печать строоки БОЛЬШИМ КАПСОМ
Shtrih.StringForPrinting=" ИП Ку******ая Т.А. ИНН 31********22"
Shtrih.PrintString()
Shtrih.StringForPrinting="Дата составления: "+Cstr(now)
Shtrih.PrintString()
Shtrih.StringForPrinting="Принято от: "+CliName
Shtrih.PrintString()
Shtrih.StringForPrinting="Основание: образовательные услуги"
Shtrih.PrintString()
Shtrih.StringForPrinting="Оплачиваемый период: "+PayMonth
Shtrih.PrintString()
Shtrih.Quantity=1 ' Количество
Shtrih.Price=Clng(Sumcash) ' Сумма
Shtrih.StringForPrinting="Принятая сумма: "
Shtrih.Sale() ' Расчет по операции. В этом месте на чеке печатается слово ИТОГ и сумма
Shtrih.StringForPrinting="Преподаватель: "+Wname
Shtrih.PrintString()
Shtrih.StringForPrinting=" ШКОЛА ХОГВАРДС"
Shtrih.PrintWideString()
Shtrih.StringForPrinting=" тел. 8******* 83"
Shtrih.PrintWideString()
Shtrih.StringForPrinting=" ул. Заводская 8 оф.202"
Shtrih.PrintString()
Shtrih.StringForPrinting="---------------------------------------------------------" ' Эта строка печатается 2 раза (кто знает почему?)
Shtrih.PrintString()
Shtrih.Summ1=Clng(Sumcash)
Shtrih.CloseCheck() ' Закрываем чек
end sub
sub printCopy(CliName,Wname,Sumcash,PayMonth) ' Копия чека. Тут ничего кроме печати строк
Shtrih.StringForPrinting=" ПРИХОДНЫЙ КАССОВЫЙ ОРДЕР"
Shtrih.PrintWideString()
Shtrih.StringForPrinting=" КОПИЯ"
Shtrih.PrintWideString()
Shtrih.StringQuantity =1
Shtrih.FeedDocument()
Shtrih.StringForPrinting=" ИП Ку******ая Т.А. ИНН 31**************22"
Shtrih.PrintString()
Shtrih.StringForPrinting="Дата составления: "+Cstr(now)
Shtrih.PrintString()
Shtrih.StringQuantity =1
Shtrih.FeedDocument()
Shtrih.StringForPrinting="Принято от: "+CliName
Shtrih.PrintString()
Shtrih.StringForPrinting="Основание: образовательные услуги"
Shtrih.PrintString()
Shtrih.StringForPrinting="Оплачиваемый период: "+PayMonth
Shtrih.PrintString()
Shtrih.StringForPrinting="Принятая сумма: "+Sumcash
Shtrih.PrintWideString()
Shtrih.StringForPrinting="Преподаватель: "+Wname
Shtrih.PrintString()
Shtrih.StringQuantity =3
Shtrih.FeedDocument()
Shtrih.StringForPrinting="Подпись: _________________________________"
Shtrih.PrintString()
Shtrih.StringForPrinting=" ШКОЛА ХОГВАРДС"
Shtrih.PrintWideString()
Shtrih.StringForPrinting=" тел. 8 ******* 83"
Shtrih.PrintWideString()
Shtrih.StringForPrinting=" ул. Заводская 8 оф.202"
Shtrih.PrintString()
Shtrih.StringQuantity =10
Shtrih.FeedDocument()
end sub
Function Log (strLog)' Запись логов
Set objTSlog = objFSO.OpenTextFile(LogFilePath, 8)
objTSlog.Writeline strLog
objTSlog.Close
Set objTSlog2 = objFSO.OpenTextFile(LogFilePath2, 8)
objTSlog2.Writeline strLog
objTSlog2.Close
End Function
Sub FormCloseQuery(Sender,ResultPtr) ' Запрос о закрытии окна
ResultPtr.Put(Sender.Form.MessageBox("Закрыть окно и выйти из програмы?","Уже уходите?",wo.Translate("MB_OKCANCEL | MB_ICONQUESTION")) = wo.Translate("IDOK"))
log Cstr(now)+";"+CliName+";"+Sumcash+";"+PayMonth+";"+Wname+";Приложение закрыто"
End Sub
Как вы уже заметили (фраза паразит для подобных текстов) тут интерфейс создается при помощи windows system object (WSO)
Новые комментарии