Что нового

[Автоматизация] Программа ведения учета антикафе.

dim4ik))

Новичок
Сообщения
17
Репутация
2
Версия AutoIt: 3.
v3.3.8.1
Описание:
Есть необходимость написать простенькую программу для учета гостей в анти-кафе.
Что такое анти-кафе.Анти-кафе -это кафе в котором оплачивается только за время провождения в заведении. Ни за что другое гости не платят.

Суть программы: Администратор запускает программу. Нажимает кнопочку START. Программа копирует имеющийся exel-файл с новым именем(желательно чтоб именем служила дата и время создания файла) с формулами забитыми за ранее.
В формулах введется подсчет времени нахождения пользователя в помещении, а так-же сколько он должен за это заплатит
Далее приходит гость. Администратор выдает карточку посетителю, забивает ее номер в программу. Нажимает "ОК". По нажатию кнопки "ОК" происходит следующее: Программа заполняет ячейки в Excel: Номер карточки из GUI переносится в первый столбец, дата во второй столбец,время входа в третий столбец.
Далее, когда гость уходит администратор еще раз вбивает номер карточки в программу и нажимает "ОК". Программа проверяет столбец с номерами карточек, находит вбитый ранее номер, находит его. Напротив номера в четвертом столбце программа вбивает время ухода гостя. В 5,6,7,8 столбце Excel подсчитывает сумму к оплате. Программа берет
значение из 8 столбца и выводит на экран администратору, что гость должен заплатить такую-то сумму денег.
В конце рабочего дня администратор нажимает кнопку STOP. Ему программа выводит статистику: Клиентов за день, касса за день.

Также в программе светится текущая статистика: клиентов в зале, клиентов за день.



Примечания:
На данном этапе получилось сделать только GUI.
Ни как не могу подружиться с exce :shok:l. Что конкретно мне нужно от Excel- читать выше.
Кому не лень- подскажите, пожалуйста. Ибо сам тупить долго буду.

Ниже выкладываю то что имеется сейчас:
Код:
#include <GuiEdit.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Excel.au3>


Opt("GUIOnEventMode", 1)
$Form2 = GUICreate("Form2", 595, 398, 338, 278,$ws_popup)
 GUIRegisterMsg($WM_NCHITTEST,   'WM_NCHITTEST')
;$ws_popup

$i_number = GUICtrlCreateInput("Введите номер карточки", 30, 80, 300, 30)
$OK = GUICtrlCreateButton("OK", 360, 80, 60, 30)
GUICtrlSetOnEvent(-1, "OKPressed")
$client_in = GUICtrlCreateLabel("КЛИЕНТОВ В ЗАЛЕ", 30, 140, 300, 30)
$N_client_in = GUICtrlCreateLabel("", 360, 140, 60, 30)
$client_day = GUICtrlCreateLabel("КЛИЕНТОВ ЗА ДЕНЬ", 32, 200, 300, 30)
$n_client_day = GUICtrlCreatelabel("", 360, 200, 60, 30)

$start = GUICtrlCreateButton("START", 30, 250, 140, 60)
GUICtrlSetOnEvent(-1, "STARTPressed")
$stop = GUICtrlCreateButton("STOP", 190, 250, 140, 60)
GUICtrlSetOnEvent(-1, "STOPPressed")


GUISetState()



While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

	EndSwitch
WEnd



Func OKPressed() 
   $number= GUICtrlRead($i_number)
  MsgBox(64,"INFO", $number)
  EndFunc
  
  Func STARTPressed()


  MsgBox(64,"INFO", "Workit")
  EndFunc  
  Func STOPPressed()
   Exit 0
  
  EndFunc
  
   
   
  
  ;=========================================ДВИГАТЬ ОКНО  GUI
  Func WM_NCHITTEST($hWnd, $Msg, $wParam, $lParam)
    Local $iProc = DllCall('user32.dll', 'int', 'DefWindowProc', 'hwnd', $hWnd, 'int', $Msg, 'wparam', $wParam, 'lparam', $lParam)
    If $iProc[0] = $HTCLIENT Then Return $HTCAPTION
    Return $GUI_RUNDEFMSG
 EndFunc
 ;=========================================ДВИГАТЬ ОКНО
Excel файл выкладываю по ссылке ниже.
http://www.pifp.ru/s/file/429b1420ed2fc9518c2014a222b831c/31259


======================================================================



Благодаря WSWR программа практически готова к использованию, за что WSWR огромная благодарность, основной алгоритм программы я взял из его кода но перевел его из OPENOFFICE В Excel так как была необходимость запаролить файл в котором ведется учет, чтоб кассир не смог его редактировать без программы. В целом программа отлично работает, но периодически выскакивает ошибка "Array variable has subscript badly formatted. Ошибка вылитает когда захочет, немогу отследить почему. Может 1 раз в день вылететь, а может 5 раз в час. Причина ее появления мне неизвестна... Кто с таким сталкивался подскажите... Ниже выкладываю скрин ошибки, полный исходный код программы, и исходные файлы для работы программы. Все файлы должны лежать в папке программы.

Скрин ошибки тут http://cs421523.vk.me/v421523570/a73c/TnwsYwPGz_Q.jpg

Полный исходный код программы ниже.
Код:
; Подключение стандартных функций ===============================================================================================
#include <Date.au3>
#include <Array.au3>
#include <GuiStatusBar.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <ButtonConstants.au3>
#include <WindowsConstants.au3>
#Include <Excel.au3>

; Подключение стандартных функций ===============================================================================================
; #OnAutoItStartRegister "RUNPressed"

Opt('GUIOnEventMode', 1) ; активация кнопок GUI
FileInstall("logo.jpg", @ScriptDir)
; Установка горячих клавищ ======================================================================================================
HotKeySet ( "{ENTER}", "WORKPressed" ) ;клавиша ENTER посылается после ввода данных с помощью штрих-сканера... по этому она вызывает функцию WORKPressed
;HotKeySet ( "{Space}", "OKPressed" ) ; клавиша SPACE забита для удобства нажимания кнопки OK
; Установка горячих клавищ ======================================================================================================
;========================================================================================================================================================================================================
; Объявление переменных ============================================================================================== 
Global $num, $num1, $num2, $num3, $num4, $num5, $num6, $num7, $num8, $num9, $num10 ; переменные необходимы для вывода мини-истории (номер карточки)
Global $sum, $sum1, $sum2, $sum3, $sum4, $sum5, $sum6, $sum7, $sum8, $sum9, $sum10 ; переменные необходимы для вывода мини-истории (сумма к оплате)
Global $oExcel, $sPatch = @ScriptDir & '\LOG.xls' ; Путь к заполняемому файлу
Global $i_number, $oNumber, $sITIME,$sITIM, $sOTIME,$sOTIM, $sATIME,$sATIM, $stMONEY, $stMONE, $sCNUMBER, $sDate, $sATIMH, $nump
Global $GUESTIN, $GUESTAD, $fCash, $aCash, $dCash, $runned
Global $oCards[3500]



$Form2 = GUICreate('LIBERTY', 1000, 450, -1, -1) ; Создание GUI

$Pic1 = GUICtrlCreatePic(@ScriptDir & "\logo.jpg", 0, 0, 400, 400) ;логотип

GUICtrlSetState($Pic1, $GUI_DISABLE) ; отключить картинку чтоб не вылазила поверх кнопок
GUIRegisterMsg($WM_NCHITTEST, 'WM_NCHITTEST') ; Регистрация пользовательских функций для известных кодов (ID) сообщений Windows (WM_MSG). ------------------------???????????????????
GUISetBkColor(0x4b2202) ; установка фонового цвета

$Group1 = GUICtrlCreateGroup("", -10 ,-10, 410, 470); создание группы
GUICtrlCreateGroup("", -99, -99, 1, 1)


$List1 = GUICtrlCreateList("", 420, 280, 560, 150); создание поля List для ведения миниистории о действиях программы

$viev = GUICtrlCreateButton('Показать',  600,105, 60, 19) ; Кнопка показа кассы
GUICtrlSetOnEvent($viev, 'VIEVPressed'); 
GUICtrlSetState($viev, $GUI_DISABLE)

$run = GUICtrlCreateButton('Начать работу!', 30, 250, 140, 60) ; Кнопка запуска программы. Что делает смотреть в описании функции RUNPressed
GUICtrlSetOnEvent($run, 'RUNPressed'); Активация кнопки RUN
$stop = GUICtrlCreateButton('Закрыть программу', 190, 320, 140, 60) ; Кнопка завершения работы с программой. Что делает смотреть в описании функции EXITPressed
GUICtrlSetOnEvent($stop, 'EXITPressed'); Активация кнопки EXIT
;$his = GUICtrlCreateButton('HISTORY', ) ; Кнопка вывода миниистории. Что делает смотреть в описании функции HISTORYPressed
;GUICtrlSetOnEvent(-1, 'HISTORYPressed'); Активация кнопки HYSTORYPressed
$help = GUICtrlCreateButton('Помощь',30, 320, 140, 60 ) ; Кнопка минисправки. Что делает смотреть в описании функции HELPPressed
GUICtrlSetOnEvent($help, 'HELPPressed'); Активация кнопки HELP


$Checkbox1 = GUICtrlCreateCheckbox("Проверка", 190, 250, 140, 60, $BS_PUSHLIKE + $BS_BITMAP) ;создание CHECKBOX для включения отключения режима проверки

$i_number = GUICtrlCreateInput('', 30, 150, 300, 30, 0x2000) ; создание поля ввода номера карточки
GUICtrlSetLimit($i_number,8,8)
GUICtrlSetState($i_number, $GUI_DISABLE); Отключение поля ввода ;i_number
GUICtrlSetData($i_number, 'Нажмите кнопку "Начать работу" !'); Установка значения в поле $i_number
$info = GUICtrlCreateLabel("Информация", 600, 10, 200, 50); Заголовок -текст Информация
GUICtrlSetFont(-1, 22, 400, 0, "Bauhaus 93") ; установка шрифта
GUICtrlSetColor(-1, 0xFFFF00) ;установка цвета шрифта.


$Group2 = GUICtrlCreateGroup("", 705 ,50, 275, 180); объединение в группу
GUICtrlCreateGroup("", -99, -99, 1, 1) ;объединение в гуппу
GUICtrlCreateLabel("№ карточки", 720, 60, 100, 20); Текст № карточки
GUICtrlSetFont(-1, 16, 400, 0, "Bauhaus 93"); установка шрифта
GUICtrlSetColor(-1, 0xFFFF00); установка цвета
$sCNUMBER = GUICtrlCreateLabel("", 850, 62, 120, 20); Поле вывода номера карточки
GUICtrlSetData(-1, ""); очистка поля
GUICtrlSetFont(-1, 16, 400, 0, "Bauhaus 93") ;установка шрифта
GUICtrlSetColor(-1, 0xFFFF00); установка цвета
GUICtrlCreateLabel("Время входа", 720, 80, 200, 20) ; текст Время входа
GUICtrlSetFont(-1, 14, 400, 0, "Bauhaus 93"); установка шрифта
GUICtrlSetColor(-1, 0xFFFF00); установка цвета
$sITIME = GUICtrlCreateLabel("", 850, 82, 120, 20); поле ввода информации о времени входа
GUICtrlSetData(-1, ""); обнуление поля
GUICtrlSetFont(-1, 16, 400, 0, "Bauhaus 93") ; установка шрифта
GUICtrlSetColor(-1, 0xFFFF00); установка цвета
GUICtrlCreateLabel("Время выхода", 720,100, 200, 20); текст Время выхода
GUICtrlSetFont(-1, 14, 400, 0, "Bauhaus 93"); установка шрифта
GUICtrlSetColor(-1, 0xFFFF00); установка цвета
$sOTIME = GUICtrlCreateLabel("", 850, 102, 120, 20); поле ввода информации о времени выхода
GUICtrlSetData(-1, ""); обнуление информации
GUICtrlSetFont(-1, 16, 400, 0, "Bauhaus 93"); установка шрифта
GUICtrlSetColor(-1, 0xFFFF00);установка цвета
GUICtrlCreateLabel("Проведено", 720, 120, 120, 20) ; текст Проведено
GUICtrlSetFont(-1, 14, 400, 0, "Bauhaus 93") ; установка шрифта
GUICtrlSetColor(-1, 0xFFFF00);установка цвета
$sATIME = GUICtrlCreateLabel("", 850, 122, 120, 20); поле ввода информации о проведенном времени
GUICtrlSetData(-1, ""); обнуление информации
GUICtrlSetFont(-1, 16, 400, 0, "Bauhaus 93");установка шрифта
GUICtrlSetColor(-1, 0xFFFF00); установка цвета
GUICtrlCreateLabel("СУММА", 720,190, 100, 35); Текст Сумма
GUICtrlSetFont(-1, 20, 400, 0, "Bauhaus 93"); установка шрифта
GUICtrlSetColor(-1, 0xFFFF00); Установка цвета
$stMONEY = GUICtrlCreateLabel("", 820, 175, 145, 50); поле ввода информации о сумме к оплате
GUICtrlSetData(-1, ""); обнуление информаци
GUICtrlSetFont(-1, 35, 400, 0, "Bauhaus 93"); установка шрифта
GUICtrlSetColor(-1, 0xFFFF00); установка цвета
$Group3 = GUICtrlCreateGroup("", 420 ,50, 275, 85); объеденение в группу
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group4 = GUICtrlCreateGroup("", 420 ,140, 275, 90); объединение в группу
GUICtrlCreateGroup("", -99, -99, 1, 1)
$sString = GUICtrlCreateLabel("", 422, 260, 1000, 20) ; Строка для ввода текста над полем ввода истории
GUICtrlSetFont(-1,10, 550, 0, ""); установка шрифта
GUICtrlSetColor(-1, 0xFFFF00); установка цвета
GUICtrlSetData(-1, "         Дата  Номер карты    Время входа    Время выхода    Времени проведено    Сумма"); текст в строке $sString


$iGuest = GUICtrlCreateLabel("", 435,65, 200, 19); текст Гостей в зале
GUICtrlSetFont(-1,12, 550, 0, "") ; установка шрифта
GUICtrlSetColor(-1, 0xFFFF00); установка цыета
GUICtrlSetData(-1, "Гостей в зале"); Текст Гостей в зале

$isGuest = GUICtrlCreateLabel("", 610,65, 30, 19) ; создание поля ввода информации о количестве клиентов в зале
GUICtrlSetFont(-1,12, 550, 0, "Bauhaus 93"); установка шрифта
GUICtrlSetColor(-1, 0xFFFF00); установка цвета
GUICtrlSetData(-1, "0"); установка начального значения

$aGuest = GUICtrlCreateLabel("", 435, 85, 200, 19); текст Гостей за сегодня
GUICtrlSetFont(-1,12, 550, 0, ""); установка шрифта
GUICtrlSetColor(-1, 0xFFFF00); установка цвета шрифта
GUICtrlSetData(-1, "Гостей за сегодня"); текст Гостей за сегодня

$asGuest = GUICtrlCreateLabel("", 610,85, 30, 19); создание поля ввода информации о количестве гостей за сегодня
GUICtrlSetFont(-1,12, 550, 0, "Bauhaus 93"); установка шрифта
GUICtrlSetColor(-1, 0xFFFF00); установка цвета
GUICtrlSetData(-1, "0"); установка начального значения


$dCash = GUICtrlCreateLabel("", 435,105, 150, 19); текст Касса за сегодня
GUICtrlSetFont(-1,12, 550, 0, ""); установка шрифта
GUICtrlSetColor(-1, 0xFFFF00); установка цвета
GUICtrlSetData(-1, "Минуты"); текст Касса за сегодня

;$fCash = GUICtrlCreateLabel("", 610,105, 80, 19);создание поля ввода для ввода информации о сумме положеной в кассу за сегодня
;GUICtrlSetFont(-1,12, 550, 0, "Bauhaus 93"); установка шрифта
;GUICtrlSetColor(-1, 0xFFFF00);установка цвета
;GUICtrlSetData(-1, "0"); установка начального значения

$STATUS = GUICtrlCreateLabel("", 435,155, 250, 70); поле ввода информации о том что делает программа
GUICtrlSetFont(-1,20, 550, 0, "Bauhaus 93"); установка шрифта
GUICtrlSetColor(-1, 0xFFFF00)
GUICtrlSetData(-1, 'Нажмите кнопку "Начать работу" !')


$iDummy = GUICtrlCreateDummy()
Dim $aAccelKeys[1][2] = [["{ENTER}", $iDummy]]
GUISetAccelerators($aAccelKeys)

GUISetState(@SW_SHOW, $Form2)

















While 1
   ControlFocus('','',$i_number)
    Sleep(1000)
WEnd
; Я не знаю что это.Кто может объяснить, напишите в коментариях=================================================================


;=========================================================================================================================================================================================   
Func RUNPressed(); функция RUNPressed
    
   
   
   GUICtrlSetState($run, $GUI_DISABLE)
   GUICtrlSetData($STATUS, "Загрузка...")
   GUICtrlSetData($i_number, "Загрузка.Подождите...")
   $runned = 0
   $sPassword= "lib77722777lib"
   $sWritePassword = "lib77722777lib"
  
    If Not FileExists($sPatch) Then FileCopy(@ScriptDir & '\LOG.xls', $sPatch)
    $oExcel = _ExcelBookOpen($sPatch,0,False,$sPassword,$sWritePassword)
			_ExcelWriteCell($oExcel,"'" & _NowDate(), 'E4') 
			
			$GUESTIN=_ExcelReadCell($oExcel, 'D3')
			$GUESTAD=_ExcelReadCell($oExcel, 'D4')
			$aCash=_ExcelReadCell($oExcel, 'D5')
			GUICtrlSetData($isGuest, $GUESTIN)
			GUICtrlSetData($asGuest, $GUESTAD)
			GUICtrlSetData($fCash, $aCash & 'грн.')
			
			
			
			
			
			$oCards = _ExcelReadArray($oExcel,8,1,3000,1)
			$nump = 1000
	
			 GUICtrlSetData($i_number, '')
		     GUICtrlSetState($i_number, $GUI_ENABLE)
			 ControlFocus('','',$i_number)
			 GUICtrlSetState($viev, $GUI_ENABLE)
			 GUICtrlSetData($STATUS, "Ожидание ввода" & @CR & "номера карточки...")
EndFunc   ;конец функции RUNPressed
 ControlFocus('','',$i_number)
Func WORKPressed();Функция WORKPressed
   if $runned = 0 then
           GUICtrlSetState($i_number, $GUI_DISABLE)
		   
            ;If Not IsObj($oExcel) Then Return SetError(1, 0, 0) ; проверяет, является ли переменная или выражение типом данных Объект
	
    Local $number = GUICtrlRead($i_number) ; присваиваивание переменной $number значение введеное в поле ввода номера карточки
          GUICtrlSetData($i_number, 'Обработка данных...')
		  $runned = 1
		  $double=$number/10000000
		  
	
	;If $number = '' Then Return SetError(2, 0, 0) ; Проверка введен ли номер в переменную
       if $double < 1  Then
		 
		  GUICtrlSetFont($STATUS,15, 550, 0, "Bauhaus 93")
		  GUICtrlSetData($STATUS, "Неверный ввод!" & @CR & "Ожидание ввода номера карточки...")
		  $runned = 0
		  GUICtrlSetData($i_number, '')
		  ControlFocus('','',$i_number)
		  else
		  
	  	   $fNumber = _ArraySearch($oCards, $number);поиск номера строки по массиву $oCards с номером необходимой карты картой
		   sleep(100)
	       $oNumber= _ExcelReadCell($oExcel,'B2'); поиск строки для ввода данных, № строки берется из ячейки B2, в которой запита формула поиска пустой строчки
 		        sleep(100)
             If $fNumber = -1 Then ; если номер карточки введенный в поле ввода $i_number НЕ НАЙДЕН в массиве $oCards тогда (Цикл 1)
               sleep(100)
		        GUICtrlSetFont($STATUS,20, 550, 0, "Bauhaus 93")
			    GUICtrlSetData($STATUS, "Регистрация" & @CR & "гостя...")
			    GUICtrlSetData($sCNUMBER,$number)
			    GUICtrlSetData($sITIME, _NowTime(4))
			    GUICtrlSetData($sOTIME,'')
			    GUICtrlSetData($sATIME,'')
		        GUICtrlSetData($stMONEY,'')
		        sleep(100)
				
		        $oCards[$oNumber-8]= $number
				sleep(100)
                _ExcelWriteCell($oExcel, $number, 'C' & $oNumber) ; пишем номер карточки в колонку С и строку указанную в переменной $oNumber
		        _ExcelWriteCell($oExcel,"'" & _NowDate(), 'B' & $oNumber) ; пишем текущую дату в колонку B и строку указанную в переменной $oNumber
			    _ExcelWriteCell($oExcel,"'" & _NowTime(4), 'D' & $oNumber) ; пишем текущее время в колонку B и строку указанную в переменной $oNumber
		        sleep(100)
		  
		  
	        
		        
		  
		 sleep(100)
			$GUESTIN=_ExcelReadCell($oExcel, 'D3')
			$GUESTAD=_ExcelReadCell($oExcel, 'D4')
			GUICtrlSetData($isGuest, $GUESTIN)
			GUICtrlSetData($asGuest, $GUESTAD)
		 
		 sleep(100)
		 GUICtrlSetData($i_number, 'Сохранение, подождите...')
		 _ExcelBookSave($oExcel) ;сохраняемся
		 GUICtrlSetData($i_number, '')
		 
		 
		 sleep(100)
		 GUICtrlSetFont($STATUS,15, 550, 0, "Bauhaus 93")
		 GUICtrlSetData($STATUS, "Гость зарегестрирован. " & @CR & "Ожидание ввода номера карточки...")
		 sleep (500)
		 ;GUICtrlSetData($STATUS, "Ожидание ввода" & @CR & "номера карточки...")
		 ;;;;;;;;;;;;;;;;;;;;;;;;;;;GUICtrlSetData($iGuest, ''$iGuest
		 
		 GUICtrlSetState($i_number, $GUI_ENABLE)
		
		 ControlFocus('','',$i_number)
		 $runned = 0
	  Else ; если номер карточки введенный в поле ввода $i_number НАЙДЕН в массиве $oCards тогда
		 sleep(100)
		 $sCheckbox = GUICTRLREAD($Checkbox1)
        if $sCheckbox = 4 Then
		 sleep(100)
		 GUICtrlSetFont($STATUS,20, 550, 0, "Bauhaus 93")
		 GUICtrlSetData($STATUS, "Расчет гостя...")
        If _ExcelReadCell($oExcel, 'E' & $fNumber+8) = '' Then ; Если колонка Е с номером строки $fNumber(совпадает с номером строчки в массиве $oCard) пустая (в эту колонку забиваеться время выхода гостя) тогда
		   _ExcelWriteCell($oExcel,"'" & _NowTime(4), 'E' & $fNumber+8); Запишем текущее время в эту же колонку (время выхода гостя) (Цикл 2)
		    GUICtrlSetData($sOTIME,_NowTime(4))
            sleep(100); дадим Excel время подумать и посчитать сколько же гость должен заплатить...		   
		  	$imoney=_ExcelReadCell($oExcel, 'H' & $fNumber+8); переменной $iMoney присвоим количество денег указаных в колонке H с номером строчки $fNumber
            GUICtrlSetData($sCNUMBER,$number)
			$sITIM =_ExcelReadCell($oExcel, 'D' & $fNumber+8)
			GUICtrlSetData($sITIME,$sITIM)
			$oCards[$fNumber]= '0'
			$sOTIM =_ExcelReadCell($oExcel, 'E' & $fNumber+8)
			GUICtrlSetData($sOTIME,$sOTIM)
			$sATIM= _ExcelReadCell($oExcel, 'G' & $fNumber+8) ;кол-во минут в неверной форме
			$sATIMG = int($sATIM*1440); кол-во минут в верной форме
			sleep(100)
			$HOUR= 60  ; 1 час = 60 минут 
			$sATIMH= Int (($sATIMG)/$HOUR) ;кол-во часов ///INT целая часть от числа
			$sATIMM=($sATIMG-($sATIMH*60)); кол-во минут. ;MOD-остаток от деления
			
			sleep(100)
			GUICtrlSetData($sATIME,$sATIMH & 'ч ' & $sATIMM & 'мин')
		    sleep(100)
			$GUESTIN=_ExcelReadCell($oExcel, 'D3')
			$GUESTAD=_ExcelReadCell($oExcel, 'D4')
			$aCash=_ExcelReadCell($oExcel, 'D5')
			GUICtrlSetData($isGuest, $GUESTIN)
			GUICtrlSetData($asGuest, $GUESTAD)
			GUICtrlSetData($fCash, $aCash & 'грн.')
			sleep(100)
			
			$stMONE =_ExcelReadCell($oExcel, 'H' & $fNumber+8)
			GUICtrlSetData($stMONEY,$stMONE)
			
			sleep(100)
			$oCards[$fNumber]= '0'
			$sDate=_ExcelReadCell($oExcel, 'B' & $fNumber+8)
			$nump +=1
			GUICtrlSetData($List1, ""& $nump&" "& $sDate &"  "&$number &"                  " & $sITIM &"                       "&$sOTIM &"                         "& $sATIMH & ' ч ' & $sATIMM & "  мин"& "                    "& $stMONE & " грн" )
			 sleep(100)
			
		GUICtrlSetState($i_number, $GUI_DISABLE)
		GUICtrlSetData($i_number, 'Сохранение, подождите...')
	sleep(100)
		GUICtrlSetData($isGuest, $GUESTIN)
		_ExcelBookSave($oExcel) ;сохраняемся
		GUICtrlSetData($i_number, '')
		GUICtrlSetState($i_number, $GUI_ENABLE)
		ControlFocus('','',$i_number)
		 sleep(100)
		 GUICtrlSetFont($STATUS,15, 550, 0, "Bauhaus 93")
		 GUICtrlSetData($STATUS, "Гость расчитан. " & @CR & "Ожидание ввода номера карточки...")
		 GUICtrlSetState($Checkbox1, 4)
		  $runned = 0
	  EndIf; Конец цикла 2
   else;===============================================================================================================================================================================================================
sleep(100)
	  GUICtrlSetFont($STATUS,20, 550, 0, "Bauhaus 93")
		 GUICtrlSetData($STATUS, "Режим проверки!")
        If _ExcelReadCell($oExcel, 'E' & $fNumber+8) = '' Then ; Если колонка Е с номером строки $fNumber(совпадает с номером строчки в массиве $oCard) пустая (в эту колонку забиваеться время выхода гостя) тогда
		   _ExcelWriteCell($oExcel,"'" & _NowTime(4), 'E' & $fNumber+8); Запишем текущее время в эту же колонку (время выхода гостя) (Цикл 2)
		    GUICtrlSetData($sOTIME,_NowTime(4))
            sleep(100); дадим Excel время подумать и посчитать сколько же гость должен заплатить...		   
		  	$imoney=_ExcelReadCell($oExcel, 'H' & $fNumber+8); переменной $iMoney присвоим количество денег указаных в колонке H с номером строчки $fNumber
            GUICtrlSetData($sCNUMBER,$number)
			$sITIM =_ExcelReadCell($oExcel, 'D' & $fNumber+8)
			GUICtrlSetData($sITIME,$sITIM)
			;$oCards[$fNumber]= '0'
			$sOTIM =_ExcelReadCell($oExcel, 'E' & $fNumber+8)
			GUICtrlSetData($sOTIME,$sOTIM)
			$sATIM= _ExcelReadCell($oExcel, 'G' & $fNumber+8) ;кол-во минут в неверной форме
			$sATIMG = int($sATIM*1440); кол-во минут в верной форме
			sleep(100)
			$HOUR= 60  ; 1 час = 60 минут 
			$sATIMH= Int (($sATIMG)/$HOUR) ;кол-во часов ///INT целая часть от числа
			$sATIMM=($sATIMG-($sATIMH*60)); кол-во минут. ;MOD-остаток от деления
			
			sleep(100)
			GUICtrlSetData($sATIME,$sATIMH & 'ч ' & $sATIMM & 'мин')
			sleep(100)
			
			$stMONE =_ExcelReadCell($oExcel, 'H' & $fNumber+8)
			GUICtrlSetData($stMONEY,$stMONE)
		    _ExcelWriteCell($oExcel,"", 'E' & $fNumber+8)
			
		
			sleep(100)
		    
		GUICtrlSetState($i_number, $GUI_DISABLE)
		GUICtrlSetData($i_number, 'Сохранение, подождите...')
		sleep(100)
		GUICtrlSetData($i_number, '')
		GUICtrlSetState($i_number, $GUI_ENABLE)
		ControlFocus('','',$i_number)
		 sleep(100)
		 GUICtrlSetFont($STATUS,13, 550, 0, "Bauhaus 93")
		 GUICtrlSetData($STATUS, "Режим проверки отключен!" & @CR & "Информация получена!" & @CR & "Ожидание ввода номера карточки...")
		 GUICtrlSetState($Checkbox1, 4)
		 sleep(100)
		  $runned = 0
	  ;EndIf; Конец цикла 2
	  EndIf
	  EndIf; Rонец цикла 1
	  EndIf
	 EndIf
      sleep(100)
	  GUICtrlSetState($i_number, $GUI_ENABLE)
	  ControlFocus('','',$i_number)
	 
   Else
	   GUICtrlSetData($i_number, 'Не так быстро... Идет работа')
	   EndIf
EndFunc ; конец функции WORKPressed



Func EXITPressed(); функция EXITPressed
   $AYS=MsgBox(4,'Закрыть программу?','Вы уверены что хотите закончить работу с программой?')
     if $AYS=6 Then
		 $sFilePath = 'D:\Отчет\Отчет' & Random(1,10000,1)
		 $sType = "xls"
		 $fAlerts = 0
		 $fOverWrite = 1
		 $sPass = "lib77722777lib"
		 $sWritePass = "lib77722777lib"
		 $iAccessMode = 1
		 $iConflictResolution = 2
		 _ExcelBookSaveAs($oExcel, $sFilePath, $sType , $fAlerts , $fOverWrite , $sPass , $sWritePass , $iAccessMode , _
		$iConflictResolution)
	    
		 _ExcelBookSave($oExcel)
		 _ExcelBookClose($oExcel)

    Exit
 Else
	EndIf
EndFunc   ;==>EXITPressed


Func HELPPressed()
  ShellExecute(@ScriptDir & "\Help.txt")
  
  EndFunc

func VIEVPressed ()
   MsgBox(64,"Минуты", "Минуты за сегодня " & $aCash)
   EndFunc

Исходные файлы качать тут http://yadi.sk/d/inRqBEVr9GoaM


Пароль от файла LOG.xls: lib77722777lib


Да и еще один маленький но доставучий момент... может кто знает как решить...
Чтоб программа работала со сканером карт- пришлось установить HOTKEY На клавишу ENTER. Объясню почему. После считывания кода карты и ввода в соответствующее поле сканер карты посылает ENTER... По этому для удобства я прописал вызов функции по нажатию на ENTER...(Чтоб не делать кнопку OK). Все отлично работает, но клавишей ENTER не возможно пользоваться в других программах, браузере, офисе итд. Можно ли как-то сделать чтоб хоткей работал только когда программа активна?


С уважением и благодарностью ко всем откликнувшимся!
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
dim4ik))
Неплохо бы прикрепить Excel файл (шаблон), для тестирования.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
dim4ik))
А если через OpenOffice?
Как раз недавно на оф форуме выложили UDF для него
Такой вариант могу попробовать написать - у меня Excel-ля нет)
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
А не проще txt с табуляцией? Он открывается так же как таблица. Excel используется по привычке, как единственный способ представления данных. А программисту приходится либо изучать сложный формат либо автоматизировать через объекты, хотя куда проще сделать экспорт в текст и просмотр в ListView с поддержкой редактирования.
 
Автор
D

dim4ik))

Новичок
Сообщения
17
Репутация
2
WSWR, никаких проплем с OpenOffice не вижу... Так наверное даже лучше, по тому что OpenOffice бесплатная программа...Буду очень рад если поможешь!


AZJIO- не знаю как с тхт табуляцией... не сталкивался... Идея была в excel для того что бы пользователь мог дальше мудрить с этими файлами... а в блокноте сильно не помудришь... придется опять таки ручками переносить в Excel/OpenOffice.Но за попытку помочь, спасибо.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
dim4ik)) [?]
за попытку помочь, спасибо
Просто попробуй открыть txt с табами в Excel и всё увидишь. Объясняю: Вводишь число, потом жмёшь кнопку слева от Ctrl вверх 4-я кнопка вставляет таб, потом опять число, потом копию первой строки на новой строке, далее открой в Excel и увидишь как получилась таблица из 4-х ячеек. Основная проблема здесь в том что txt не ассоциирован с Excel, да и пересохранение в xls требует телодвижений. А вот может автоматизировать открытие и пересохранение такого списка, это идея. Один шаг пересохранения более надёжный, чем вставка по ячейкам.
 
Автор
D

dim4ik))

Новичок
Сообщения
17
Репутация
2
Просто попробуй открыть txt с табами в Excel и всё увидишь. Объясняю: Вводишь число, потом жмёшь кнопку слева от Ctrl вверх 4-я кнопка вставляет таб, потом опять число, потом копию первой строки на новой строке, далее открой в Excel и увидишь как получилась таблица из 4-х ячеек. Основная проблема здесь в том что txt не ассоциирован с Excel, да и пересохранение в xls требует телодвижений. А вот может автоматизировать открытие и пересохранение такого списка, это идея. Один шаг пересохранения более надёжный, чем вставка по ячейкам.

Это интересная идея, мне понравилось... но даже если я и смогу занести информацию(номер карточки, дата, время входа) в TXT файл... то организовать построчный поиск номера карточки и занос информацию в туже строку у меня скорее всего не получиться(( Если есть возможность помочь- очень прошу!
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
dim4ik
так может тебе база данных нужна?
 
Автор
D

dim4ik))

Новичок
Сообщения
17
Репутация
2
На счет БД думал, но не уверен что мне это подходит... Будут сложности с составлениями отчетов. Тем более что друг, которому я пытаюсь это сделать кроме excel- ничего не знает...
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
dim4ik))
База данных это просто место хранение данных и не более. Она не является инструментом просмотра, это способ хранения.

то организовать построчный поиск номера карточки и занос информацию в туже строку у меня скорее всего не получиться
Данные не ищутся по текстовому файлу, он является только местом хранения. Программа при старте парсит файл, отправляя информацию в массив. А для массива уже есть функции поиска/сортировки по колонке и соответственно получая индекс строки можно вытащить/изменить информацию. Если таб не является элементом данных то он вполне сойдёт за разделитель и не нужно заморачиваться с базой данных, просто экспорт в массив.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
dim4ik))
Отсюда http://www.autoitscript.com/forum/topic/151530-ooolibo-calc-udf/?p=1084698
OOoCalc.au3, положить рядом со скриптом или в папку Include в папке Autoit
Библиотека, конечно, сыровата еще, но хоть какая-то альтернатива...

Код:
#include <Date.au3>
#include <Array.au3>
#include <GuiStatusBar.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <ButtonConstants.au3>
#include <WindowsConstants.au3>

#include <OOoCalc.au3> ; http://www.autoitscript.com/forum/topic/151530-ooolibo-calc-udf/?p=1084698

Opt('GUIOnEventMode', 1)

Global $oCalc, $sPatch = @ScriptDir & '\' & @YEAR & '_' & @MON & '_' & @MDAY & '.ods'
Dim $aParts[2] = [250, 250]

$Form2 = GUICreate('Form2', 600, 400, -1, -1, $ws_popup)
GUIRegisterMsg($WM_NCHITTEST, 'WM_NCHITTEST')
GUISetBkColor(0xD9DFF0)
$i_number = GUICtrlCreateInput('', 30, 80, 300, 30, 0x2000)
$OK = GUICtrlCreateButton('OK', 360, 80, 60, 30)
GUICtrlSetOnEvent(-1, 'OKPressed')

$_hStatus = _GUICtrlStatusBar_Create($Form2, $aParts)

$start = GUICtrlCreateButton('START', 30, 250, 140, 60)
GUICtrlSetOnEvent(-1, 'STARTPressed')
$stop = GUICtrlCreateButton('STOP', 190, 250, 140, 60)
GUICtrlSetOnEvent(-1, 'STOPPressed')

GUISetState()
WinSetOnTop($Form2, '', 1)

While 1
	Sleep(10)
WEnd


Func OKPressed()
	If Not IsObj($oCalc) Then Return SetError(1, 0, 0)
	Local $number = GUICtrlRead($i_number)
	If $number = '' Then Return SetError(2, 0, 0)

	$aFind = _OOoCalcReadSheetToArray($oCalc, 'A8:D1000') ; читаем 1000 строк
	$iFind = _ArraySearch($aFind, $number)

	If $iFind = -1 Then
		For $i = 0 To UBound($aFind) - 1
			If $aFind[$i][0] = '' Then ExitLoop
		Next
		_OOoCalcWriteCell($oCalc, $number, 'A' & $i + 8) ; пишем
		_OOoCalcWriteCell($oCalc, _NowDate(), 'B' & $i + 8) ;
		_OOoCalcWriteCell($oCalc, _NowTime(4), 'C' & $i + 8) ;
	Else
		If _OOoCalcReadCell($oCalc, 'D' & $iFind + 8) = '' Then _OOoCalcWriteCell($oCalc, _NowTime(4), 'D' & $iFind + 8) ;
	EndIf
	_OOoCalcBookSave($oCalc)
	$aFind = _OOoCalcReadSheetToArray($oCalc, 'A8:D1000') ; читаем 1000 строк
	Local $k = 0

	For $i = 0 To UBound($aFind) - 1
		If $aFind[$i][0] <> '' And $aFind[$i][1] <> '' And $aFind[$i][2] <> '' And $aFind[$i][3] = '' Then $k += 1
		If $aFind[$i][0] = '' Then ExitLoop
	Next

	_GUICtrlStatusBar_SetText($_hStatus, 'КЛИЕНТОВ В ЗАЛЕ:  ' & $k, 0)
	_GUICtrlStatusBar_SetText($_hStatus, 'КЛИЕНТОВ ЗА ДЕНЬ:  ' & $i, 1)

EndFunc   ;==>OKPressed

Func STARTPressed()
	If Not FileExists($sPatch) Then FileCopy(@ScriptDir & '\LOG.ods', $sPatch)
	$oCalc = _OOoCalcBookOpen($sPatch, True)
EndFunc   ;==>STARTPressed


Func STOPPressed()
	If Not IsObj($oCalc) Then Exit
	If Not WinExists('[Class:SALFRAME]', '') Then Exit
	_OOoCalcBookSave($oCalc)
	_OOoCalcBookClose($oCalc)
	Exit
EndFunc   ;==>STOPPressed


;=========================================ДВИГАТЬ ОКНО  GUI
Func WM_NCHITTEST($hWnd, $Msg, $wParam, $lParam)
	Local $iProc = DllCall('user32.dll', 'int', 'DefWindowProc', 'hwnd', $hWnd, 'int', $Msg, 'wparam', $wParam, 'lparam', $lParam)
	If $iProc[0] = $HTCLIENT Then Return $HTCAPTION
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NCHITTEST
;=========================================ДВИГАТЬ ОКНО

В приложенном архиве пример файла формата ods для OpenOffice, положить рядом со скриптом
У меня только почему-то не работают нормально формулы, наверно, их переписывать нужно...

AZJIO правильно пишет, проще все на Autoit написать, он будет считать и отслеживать, а в конце дня по нажатию кнопки генерить отчет для архива в каком-нибудь виде.
 
Автор
D

dim4ik))

Новичок
Сообщения
17
Репутация
2
WSWR, примного тебе благодарен. Сейчас попытаюсь разобраться. Спасибо большое!
 
Автор
D

dim4ik))

Новичок
Сообщения
17
Репутация
2
Прошу посмотреть описание темы. Кому не лень- помогите, пожалуста!
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
dim4ik)) [?]
Можно ли как-то сделать чтоб хоткей работал только когда программа активна?
GUISetAccelerators?

Если для стороннего окна, то при срабатывании горячей клавиши разрегистрировать её и выслать Enter снова, потом зарегистрировать опять. Но это при условии что окно иное, а если окно конкретное, то вызвать соответствующую функцию.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
dim4ik,
у тебя проблемы с $oCards.
Добавь вот эти две строки в код и посмотри что получится.
Код:
$double=$number/10000000 ; <=== вот после этой строки добавить :
_ArrayDisplay($oCards)
MsgBox(0,"ошибка",@error)
 
Автор
D

dim4ik))

Новичок
Сообщения
17
Репутация
2
При запуске скрипта из SciTE иногда вываливается следующая ошибка http://cs418523.vk.me/v418523570/6ed5/uptiUBBDT_M.jpg

может ли она быть связана с http://cs421523.vk.me/v421523570/a73c/TnwsYwPGz_Q.jpg

как с ней подружиться чтоб не ругалась?


Добавлено:
Сообщение автоматически объединено:

Вышеописанная ошибка к сожалению не связана с ошибкой http://cs421523.vk.me/v421523570/a73c/TnwsYwPGz_Q.jpg она возникает при неверном закрытии скрипта без закрытия фонового файла excel(((

Вопрос с ошибкой так и не решен! Помогайте, без вас не справлюсь!
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
dim4ik))

Чтобы Enter работала только в окне программы, можно использовать функцию из
HotKey.au3 от Yashied http://autoit-script.ru/index.php/topic,296.0.html

Применил к твоему коду Tidy(это утилита для улучшения читаемости кода, есть здесь http://www.autoitscript.com/site/autoit-script-editor/downloads/)
а то код плохо читается


Код:
; Подключение стандартных функций ===============================================================================================
#include <Date.au3>
#include <Array.au3>
#include <GuiStatusBar.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <ButtonConstants.au3>
#include <WindowsConstants.au3>
#include <Excel.au3>

#include <HotKey.au3> ; http://autoit-script.ru/index.php/topic,296.0.html

; Подключение стандартных функций ===============================================================================================
; #OnAutoItStartRegister "RUNPressed"

Opt('GUIOnEventMode', 1) ; активация кнопок GUI
FileInstall("logo.jpg", @ScriptDir)
;=================================
;========================================================================================================================================================================================================
; Объявление переменных ==============================================================================================
Global $num, $num1, $num2, $num3, $num4, $num5, $num6, $num7, $num8, $num9, $num10 ; переменные необходимы для вывода мини-истории (номер карточки)
Global $sum, $sum1, $sum2, $sum3, $sum4, $sum5, $sum6, $sum7, $sum8, $sum9, $sum10 ; переменные необходимы для вывода мини-истории (сумма к оплате)
Global $oExcel, $sPatch = @ScriptDir & '\LOG.xls' ; Путь к заполняемому файлу
Global $i_number, $oNumber, $sITIME, $sITIM, $sOTIME, $sOTIM, $sATIME, $sATIM, $stMONEY, $stMONE, $sCNUMBER, $sDate, $sATIMH, $nump
Global $GUESTIN, $GUESTAD, $fCash, $aCash, $dCash, $runned
Global $oCards[3500]
Global Const $VK_1 = 0x0D

$Form2 = GUICreate('LIBERTY', 1000, 450, -1, -1) ; Создание GUI

; Установка горячих клавиш ======================================================================================================
;HotKeySet("{ENTER}", "WORKPressed") ;клавиша ENTER посылается после ввода данных с помощью штрих-сканера... по этому она вызывает функцию WORKPressed

_HotKeyAssign($VK_1, "WORKPressed", 0, $Form2) ; ENTER только для окна программы

;HotKeySet ( "{Space}", "OKPressed" ) ; клавиша SPACE забита для удобства нажимания кнопки OK
; Установка горячих клавиш =====================================================================

$Pic1 = GUICtrlCreatePic(@ScriptDir & "\logo.jpg", 0, 0, 400, 400) ;логотип

GUICtrlSetState($Pic1, $GUI_DISABLE) ; отключить картинку чтоб не вылазила поверх кнопок
GUIRegisterMsg($WM_NCHITTEST, 'WM_NCHITTEST') ; Регистрация пользовательских функций для известных кодов (ID) сообщений Windows (WM_MSG). ------------------------???????????????????
GUISetBkColor(0x4b2202) ; установка фонового цвета

$Group1 = GUICtrlCreateGroup("", -10, -10, 410, 470); создание группы
GUICtrlCreateGroup("", -99, -99, 1, 1)


$List1 = GUICtrlCreateList("", 420, 280, 560, 150); создание поля List для ведения миниистории о действиях программы

$viev = GUICtrlCreateButton('Показать', 600, 105, 60, 19) ; Кнопка показа кассы
GUICtrlSetOnEvent($viev, 'VIEVPressed');
GUICtrlSetState($viev, $GUI_DISABLE)

$run = GUICtrlCreateButton('Начать работу!', 30, 250, 140, 60) ; Кнопка запуска программы. Что делает смотреть в описании функции RUNPressed
GUICtrlSetOnEvent($run, 'RUNPressed'); Активация кнопки RUN
$stop = GUICtrlCreateButton('Закрыть программу', 190, 320, 140, 60) ; Кнопка завершения работы с программой. Что делает смотреть в описании функции EXITPressed
GUICtrlSetOnEvent($stop, 'EXITPressed'); Активация кнопки EXIT
;$his = GUICtrlCreateButton('HISTORY', ) ; Кнопка вывода миниистории. Что делает смотреть в описании функции HISTORYPressed
;GUICtrlSetOnEvent(-1, 'HISTORYPressed'); Активация кнопки HYSTORYPressed
$help = GUICtrlCreateButton('Помощь', 30, 320, 140, 60) ; Кнопка минисправки. Что делает смотреть в описании функции HELPPressed
GUICtrlSetOnEvent($help, 'HELPPressed'); Активация кнопки HELP

$Checkbox1 = GUICtrlCreateCheckbox("Проверка", 190, 250, 140, 60, $BS_PUSHLIKE + $BS_BITMAP) ;создание CHECKBOX для включения отключения режима проверки

$i_number = GUICtrlCreateInput('', 30, 150, 300, 30, 0x2000) ; создание поля ввода номера карточки
GUICtrlSetLimit($i_number, 8, 8)
GUICtrlSetState($i_number, $GUI_DISABLE); Отключение поля ввода ;i_number
GUICtrlSetData($i_number, 'Нажмите кнопку "Начать работу" !'); Установка значения в поле $i_number
$info = GUICtrlCreateLabel("Информация", 600, 10, 200, 50); Заголовок -текст Информация
GUICtrlSetFont(-1, 22, 400, 0, "Bauhaus 93") ; установка шрифта
GUICtrlSetColor(-1, 0xFFFF00) ;установка цвета шрифта.


$Group2 = GUICtrlCreateGroup("", 705, 50, 275, 180); объединение в группу
GUICtrlCreateGroup("", -99, -99, 1, 1) ;объединение в гуппу
GUICtrlCreateLabel("№ карточки", 720, 60, 100, 20); Текст № карточки
GUICtrlSetFont(-1, 16, 400, 0, "Bauhaus 93"); установка шрифта
GUICtrlSetColor(-1, 0xFFFF00); установка цвета
$sCNUMBER = GUICtrlCreateLabel("", 850, 62, 120, 20); Поле вывода номера карточки
GUICtrlSetData(-1, ""); очистка поля
GUICtrlSetFont(-1, 16, 400, 0, "Bauhaus 93") ;установка шрифта
GUICtrlSetColor(-1, 0xFFFF00); установка цвета
GUICtrlCreateLabel("Время входа", 720, 80, 200, 20) ; текст Время входа
GUICtrlSetFont(-1, 14, 400, 0, "Bauhaus 93"); установка шрифта
GUICtrlSetColor(-1, 0xFFFF00); установка цвета
$sITIME = GUICtrlCreateLabel("", 850, 82, 120, 20); поле ввода информации о времени входа
GUICtrlSetData(-1, ""); обнуление поля
GUICtrlSetFont(-1, 16, 400, 0, "Bauhaus 93") ; установка шрифта
GUICtrlSetColor(-1, 0xFFFF00); установка цвета
GUICtrlCreateLabel("Время выхода", 720, 100, 200, 20); текст Время выхода
GUICtrlSetFont(-1, 14, 400, 0, "Bauhaus 93"); установка шрифта
GUICtrlSetColor(-1, 0xFFFF00); установка цвета
$sOTIME = GUICtrlCreateLabel("", 850, 102, 120, 20); поле ввода информации о времени выхода
GUICtrlSetData(-1, ""); обнуление информации
GUICtrlSetFont(-1, 16, 400, 0, "Bauhaus 93"); установка шрифта
GUICtrlSetColor(-1, 0xFFFF00);установка цвета
GUICtrlCreateLabel("Проведено", 720, 120, 120, 20) ; текст Проведено
GUICtrlSetFont(-1, 14, 400, 0, "Bauhaus 93") ; установка шрифта
GUICtrlSetColor(-1, 0xFFFF00);установка цвета
$sATIME = GUICtrlCreateLabel("", 850, 122, 120, 20); поле ввода информации о проведенном времени
GUICtrlSetData(-1, ""); обнуление информации
GUICtrlSetFont(-1, 16, 400, 0, "Bauhaus 93");установка шрифта
GUICtrlSetColor(-1, 0xFFFF00); установка цвета
GUICtrlCreateLabel("СУММА", 720, 190, 100, 35); Текст Сумма
GUICtrlSetFont(-1, 20, 400, 0, "Bauhaus 93"); установка шрифта
GUICtrlSetColor(-1, 0xFFFF00); Установка цвета
$stMONEY = GUICtrlCreateLabel("", 820, 175, 145, 50); поле ввода информации о сумме к оплате
GUICtrlSetData(-1, ""); обнуление информаци
GUICtrlSetFont(-1, 35, 400, 0, "Bauhaus 93"); установка шрифта
GUICtrlSetColor(-1, 0xFFFF00); установка цвета
$Group3 = GUICtrlCreateGroup("", 420, 50, 275, 85); объеденение в группу
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group4 = GUICtrlCreateGroup("", 420, 140, 275, 90); объединение в группу
GUICtrlCreateGroup("", -99, -99, 1, 1)
$sString = GUICtrlCreateLabel("", 422, 260, 1000, 20) ; Строка для ввода текста над полем ввода истории
GUICtrlSetFont(-1, 10, 550, 0, ""); установка шрифта
GUICtrlSetColor(-1, 0xFFFF00); установка цвета
GUICtrlSetData(-1, "         Дата  Номер карты    Время входа    Время выхода    Времени проведено    Сумма"); текст в строке $sString

$iGuest = GUICtrlCreateLabel("", 435, 65, 200, 19); текст Гостей в зале
GUICtrlSetFont(-1, 12, 550, 0, "") ; установка шрифта
GUICtrlSetColor(-1, 0xFFFF00); установка цыета
GUICtrlSetData(-1, "Гостей в зале"); Текст Гостей в зале

$isGuest = GUICtrlCreateLabel("", 610, 65, 30, 19) ; создание поля ввода информации о количестве клиентов в зале
GUICtrlSetFont(-1, 12, 550, 0, "Bauhaus 93"); установка шрифта
GUICtrlSetColor(-1, 0xFFFF00); установка цвета
GUICtrlSetData(-1, "0"); установка начального значения

$aGuest = GUICtrlCreateLabel("", 435, 85, 200, 19); текст Гостей за сегодня
GUICtrlSetFont(-1, 12, 550, 0, ""); установка шрифта
GUICtrlSetColor(-1, 0xFFFF00); установка цвета шрифта
GUICtrlSetData(-1, "Гостей за сегодня"); текст Гостей за сегодня

$asGuest = GUICtrlCreateLabel("", 610, 85, 30, 19); создание поля ввода информации о количестве гостей за сегодня
GUICtrlSetFont(-1, 12, 550, 0, "Bauhaus 93"); установка шрифта
GUICtrlSetColor(-1, 0xFFFF00); установка цвета
GUICtrlSetData(-1, "0"); установка начального значения


$dCash = GUICtrlCreateLabel("", 435, 105, 150, 19); текст Касса за сегодня
GUICtrlSetFont(-1, 12, 550, 0, ""); установка шрифта
GUICtrlSetColor(-1, 0xFFFF00); установка цвета
GUICtrlSetData(-1, "Минуты"); текст Касса за сегодня

;$fCash = GUICtrlCreateLabel("", 610,105, 80, 19);создание поля ввода для ввода информации о сумме положеной в кассу за сегодня
;GUICtrlSetFont(-1,12, 550, 0, "Bauhaus 93"); установка шрифта
;GUICtrlSetColor(-1, 0xFFFF00);установка цвета
;GUICtrlSetData(-1, "0"); установка начального значения

$STATUS = GUICtrlCreateLabel("", 435, 155, 250, 70); поле ввода информации о том что делает программа
GUICtrlSetFont(-1, 20, 550, 0, "Bauhaus 93"); установка шрифта
GUICtrlSetColor(-1, 0xFFFF00)
GUICtrlSetData(-1, 'Нажмите кнопку "Начать работу" !')


$iDummy = GUICtrlCreateDummy()
Dim $aAccelKeys[1][2] = [["{ENTER}", $iDummy]]
;GUISetAccelerators($aAccelKeys)

GUISetState(@SW_SHOW, $Form2)


While 1
	;ControlFocus('', '', $i_number)
	Sleep(1000)
WEnd
; Я не знаю что это.Кто может объяснить, напишите в коментариях=================================================================


;=========================================================================================================================================================================================
Func RUNPressed(); функция RUNPressed

	GUICtrlSetState($run, $GUI_DISABLE)
	GUICtrlSetData($STATUS, "Загрузка...")
	GUICtrlSetData($i_number, "Загрузка.Подождите...")
	$runned = 0
	$sPassword = "lib77722777lib"
	$sWritePassword = "lib77722777lib"

	If Not FileExists($sPatch) Then FileCopy(@ScriptDir & '\LOG.xls', $sPatch)
	$oExcel = _ExcelBookOpen($sPatch, 0, False, $sPassword, $sWritePassword)
	_ExcelWriteCell($oExcel, "'" & _NowDate(), 'E4')

	$GUESTIN = _ExcelReadCell($oExcel, 'D3')
	$GUESTAD = _ExcelReadCell($oExcel, 'D4')
	$aCash = _ExcelReadCell($oExcel, 'D5')
	GUICtrlSetData($isGuest, $GUESTIN)
	GUICtrlSetData($asGuest, $GUESTAD)
	GUICtrlSetData($fCash, $aCash & 'грн.')


	$oCards = _ExcelReadArray($oExcel, 8, 1, 3000, 1)
	$nump = 1000

	GUICtrlSetData($i_number, '')
	GUICtrlSetState($i_number, $GUI_ENABLE)
	ControlFocus('', '', $i_number)
	GUICtrlSetState($viev, $GUI_ENABLE)
	GUICtrlSetData($STATUS, "Ожидание ввода" & @CR & "номера карточки...")
EndFunc   ;==>RUNPressed
;ControlFocus('', '', $i_number)

Func WORKPressed();Функция WORKPressed
	If $runned = 0 Then
		GUICtrlSetState($i_number, $GUI_DISABLE)

		;If Not IsObj($oExcel) Then Return SetError(1, 0, 0) ; проверяет, является ли переменная или выражение типом данных Объект

		Local $number = GUICtrlRead($i_number) ; присваиваивание переменной $number значение введеное в поле ввода номера карточки
		GUICtrlSetData($i_number, 'Обработка данных...')
		$runned = 1
		$double = $number / 10000000


		;If $number = '' Then Return SetError(2, 0, 0) ; Проверка введен ли номер в переменную
		If $double < 1 Then

			GUICtrlSetFont($STATUS, 15, 550, 0, "Bauhaus 93")
			GUICtrlSetData($STATUS, "Неверный ввод!" & @CR & "Ожидание ввода номера карточки...")
			$runned = 0
			GUICtrlSetData($i_number, '')
			ControlFocus('', '', $i_number)
		Else

			$fNumber = _ArraySearch($oCards, $number);поиск номера строки по массиву $oCards с номером необходимой карты картой
			Sleep(100)
			$oNumber = _ExcelReadCell($oExcel, 'B2'); поиск строки для ввода данных, № строки берется из ячейки B2, в которой запита формула поиска пустой строчки
			Sleep(100)
			If $fNumber = -1 Then ; если номер карточки введенный в поле ввода $i_number НЕ НАЙДЕН в массиве $oCards тогда (Цикл 1)
				Sleep(100)
				GUICtrlSetFont($STATUS, 20, 550, 0, "Bauhaus 93")
				GUICtrlSetData($STATUS, "Регистрация" & @CR & "гостя...")
				GUICtrlSetData($sCNUMBER, $number)
				GUICtrlSetData($sITIME, _NowTime(4))
				GUICtrlSetData($sOTIME, '')
				GUICtrlSetData($sATIME, '')
				GUICtrlSetData($stMONEY, '')
				Sleep(100)

				$oCards[$oNumber - 8] = $number
				Sleep(100)
				_ExcelWriteCell($oExcel, $number, 'C' & $oNumber) ; пишем номер карточки в колонку С и строку указанную в переменной $oNumber
				_ExcelWriteCell($oExcel, "'" & _NowDate(), 'B' & $oNumber) ; пишем текущую дату в колонку B и строку указанную в переменной $oNumber
				_ExcelWriteCell($oExcel, "'" & _NowTime(4), 'D' & $oNumber) ; пишем текущее время в колонку B и строку указанную в переменной $oNumber
				Sleep(100)



				Sleep(100)
				$GUESTIN = _ExcelReadCell($oExcel, 'D3')
				$GUESTAD = _ExcelReadCell($oExcel, 'D4')
				GUICtrlSetData($isGuest, $GUESTIN)
				GUICtrlSetData($asGuest, $GUESTAD)

				Sleep(100)
				GUICtrlSetData($i_number, 'Сохранение, подождите...')
				_ExcelBookSave($oExcel) ;сохраняемся
				GUICtrlSetData($i_number, '')


				Sleep(100)
				GUICtrlSetFont($STATUS, 15, 550, 0, "Bauhaus 93")
				GUICtrlSetData($STATUS, "Гость зарегестрирован. " & @CR & "Ожидание ввода номера карточки...")
				Sleep(500)
				;GUICtrlSetData($STATUS, "Ожидание ввода" & @CR & "номера карточки...")
				;;;;;;;;;;;;;;;;;;;;;;;;;;;GUICtrlSetData($iGuest, ''$iGuest

				GUICtrlSetState($i_number, $GUI_ENABLE)

				ControlFocus('', '', $i_number)
				$runned = 0
			Else ; если номер карточки введенный в поле ввода $i_number НАЙДЕН в массиве $oCards тогда
				Sleep(100)
				$sCheckbox = GUICtrlRead($Checkbox1)
				If $sCheckbox = 4 Then
					Sleep(100)
					GUICtrlSetFont($STATUS, 20, 550, 0, "Bauhaus 93")
					GUICtrlSetData($STATUS, "Расчет гостя...")
					If _ExcelReadCell($oExcel, 'E' & $fNumber + 8) = '' Then ; Если колонка Е с номером строки $fNumber(совпадает с номером строчки в массиве $oCard) пустая (в эту колонку забиваеться время выхода гостя) тогда
						_ExcelWriteCell($oExcel, "'" & _NowTime(4), 'E' & $fNumber + 8); Запишем текущее время в эту же колонку (время выхода гостя) (Цикл 2)
						GUICtrlSetData($sOTIME, _NowTime(4))
						Sleep(100); дадим Excel время подумать и посчитать сколько же гость должен заплатить...
						$imoney = _ExcelReadCell($oExcel, 'H' & $fNumber + 8); переменной $iMoney присвоим количество денег указаных в колонке H с номером строчки $fNumber
						GUICtrlSetData($sCNUMBER, $number)
						$sITIM = _ExcelReadCell($oExcel, 'D' & $fNumber + 8)
						GUICtrlSetData($sITIME, $sITIM)
						$oCards[$fNumber] = '0'
						$sOTIM = _ExcelReadCell($oExcel, 'E' & $fNumber + 8)
						GUICtrlSetData($sOTIME, $sOTIM)
						$sATIM = _ExcelReadCell($oExcel, 'G' & $fNumber + 8) ;кол-во минут в неверной форме
						$sATIMG = Int($sATIM * 1440); кол-во минут в верной форме
						Sleep(100)
						$HOUR = 60 ; 1 час = 60 минут
						$sATIMH = Int(($sATIMG) / $HOUR) ;кол-во часов ///INT целая часть от числа
						$sATIMM = ($sATIMG - ($sATIMH * 60)); кол-во минут. ;MOD-остаток от деления

						Sleep(100)
						GUICtrlSetData($sATIME, $sATIMH & 'ч ' & $sATIMM & 'мин')
						Sleep(100)
						$GUESTIN = _ExcelReadCell($oExcel, 'D3')
						$GUESTAD = _ExcelReadCell($oExcel, 'D4')
						$aCash = _ExcelReadCell($oExcel, 'D5')
						GUICtrlSetData($isGuest, $GUESTIN)
						GUICtrlSetData($asGuest, $GUESTAD)
						GUICtrlSetData($fCash, $aCash & 'грн.')
						Sleep(100)

						$stMONE = _ExcelReadCell($oExcel, 'H' & $fNumber + 8)
						GUICtrlSetData($stMONEY, $stMONE)

						Sleep(100)
						$oCards[$fNumber] = '0'
						$sDate = _ExcelReadCell($oExcel, 'B' & $fNumber + 8)
						$nump += 1
						GUICtrlSetData($List1, "" & $nump & " " & $sDate & "  " & $number & "                  " & $sITIM & "                       " & $sOTIM & "                         " & $sATIMH & ' ч ' & $sATIMM & "  мин" & "                    " & $stMONE & " грн")
						Sleep(100)

						GUICtrlSetState($i_number, $GUI_DISABLE)
						GUICtrlSetData($i_number, 'Сохранение, подождите...')
						Sleep(100)
						GUICtrlSetData($isGuest, $GUESTIN)
						_ExcelBookSave($oExcel) ;сохраняемся
						GUICtrlSetData($i_number, '')
						GUICtrlSetState($i_number, $GUI_ENABLE)
						ControlFocus('', '', $i_number)
						Sleep(100)
						GUICtrlSetFont($STATUS, 15, 550, 0, "Bauhaus 93")
						GUICtrlSetData($STATUS, "Гость расчитан. " & @CR & "Ожидание ввода номера карточки...")
						GUICtrlSetState($Checkbox1, 4)
						$runned = 0
					EndIf; Конец цикла 2
				Else;===============================================================================================================================================================================================================
					Sleep(100)
					GUICtrlSetFont($STATUS, 20, 550, 0, "Bauhaus 93")
					GUICtrlSetData($STATUS, "Режим проверки!")
					If _ExcelReadCell($oExcel, 'E' & $fNumber + 8) = '' Then ; Если колонка Е с номером строки $fNumber(совпадает с номером строчки в массиве $oCard) пустая (в эту колонку забиваеться время выхода гостя) тогда
						_ExcelWriteCell($oExcel, "'" & _NowTime(4), 'E' & $fNumber + 8); Запишем текущее время в эту же колонку (время выхода гостя) (Цикл 2)
						GUICtrlSetData($sOTIME, _NowTime(4))
						Sleep(100); дадим Excel время подумать и посчитать сколько же гость должен заплатить...
						$imoney = _ExcelReadCell($oExcel, 'H' & $fNumber + 8); переменной $iMoney присвоим количество денег указаных в колонке H с номером строчки $fNumber
						GUICtrlSetData($sCNUMBER, $number)
						$sITIM = _ExcelReadCell($oExcel, 'D' & $fNumber + 8)
						GUICtrlSetData($sITIME, $sITIM)
						;$oCards[$fNumber]= '0'
						$sOTIM = _ExcelReadCell($oExcel, 'E' & $fNumber + 8)
						GUICtrlSetData($sOTIME, $sOTIM)
						$sATIM = _ExcelReadCell($oExcel, 'G' & $fNumber + 8) ;кол-во минут в неверной форме
						$sATIMG = Int($sATIM * 1440); кол-во минут в верной форме
						Sleep(100)
						$HOUR = 60 ; 1 час = 60 минут
						$sATIMH = Int(($sATIMG) / $HOUR) ;кол-во часов ///INT целая часть от числа
						$sATIMM = ($sATIMG - ($sATIMH * 60)); кол-во минут. ;MOD-остаток от деления

						Sleep(100)
						GUICtrlSetData($sATIME, $sATIMH & 'ч ' & $sATIMM & 'мин')
						Sleep(100)

						$stMONE = _ExcelReadCell($oExcel, 'H' & $fNumber + 8)
						GUICtrlSetData($stMONEY, $stMONE)
						_ExcelWriteCell($oExcel, "", 'E' & $fNumber + 8)

						Sleep(100)

						GUICtrlSetState($i_number, $GUI_DISABLE)
						GUICtrlSetData($i_number, 'Сохранение, подождите...')
						Sleep(100)
						GUICtrlSetData($i_number, '')
						GUICtrlSetState($i_number, $GUI_ENABLE)
						ControlFocus('', '', $i_number)
						Sleep(100)
						GUICtrlSetFont($STATUS, 13, 550, 0, "Bauhaus 93")
						GUICtrlSetData($STATUS, "Режим проверки отключен!" & @CR & "Информация получена!" & @CR & "Ожидание ввода номера карточки...")
						GUICtrlSetState($Checkbox1, 4)
						Sleep(100)
						$runned = 0
						;EndIf; Конец цикла 2
					EndIf
				EndIf; Rонец цикла 1
			EndIf
		EndIf
		Sleep(100)
		GUICtrlSetState($i_number, $GUI_ENABLE)
		ControlFocus('', '', $i_number)

	Else
		GUICtrlSetData($i_number, 'Не так быстро... Идет работа')
	EndIf
EndFunc   ;==>WORKPressed

Func EXITPressed(); функция EXITPressed
	$AYS = MsgBox(4, 'Закрыть программу?', 'Вы уверены что хотите закончить работу с программой?')
	If $AYS = 6 Then
		$sFilePath = 'D:\Отчет\Отчет' & Random(1, 10000, 1)
		$sType = "xls"
		$fAlerts = 0
		$fOverWrite = 1
		$sPass = "lib77722777lib"
		$sWritePass = "lib77722777lib"
		$iAccessMode = 1
		$iConflictResolution = 2
		_ExcelBookSaveAs($oExcel, $sFilePath, $sType, $fAlerts, $fOverWrite, $sPass, $sWritePass, $iAccessMode, _
				$iConflictResolution)
		_ExcelBookSave($oExcel)
		_ExcelBookClose($oExcel)
		Exit
	Else
	EndIf
EndFunc   ;==>EXITPressed

Func HELPPressed()
	ShellExecute(@ScriptDir & "\Help.txt")
EndFunc   ;==>HELPPressed

Func VIEVPressed()
	MsgBox(64, "Минуты", "Минуты за сегодня " & $aCash)
EndFunc   ;==>VIEVPressed

;=========================================ДВИГАТЬ ОКНО  GUI
Func WM_NCHITTEST($hWnd, $Msg, $wParam, $lParam)
	Local $iProc = DllCall('user32.dll', 'int', 'DefWindowProc', 'hwnd', $hWnd, 'int', $Msg, 'wparam', $wParam, 'lparam', $lParam)
	If $iProc[0] = $HTCLIENT Then Return $HTCAPTION
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NCHITTEST
;=========================================ДВИГАТЬ ОКНО

Если найду компьютер с Excel, то попробую и другие ошибки отловить
 
Автор
D

dim4ik))

Новичок
Сообщения
17
Репутация
2
WSWR Спасибо, большое! Кнопочка ENTER, теперь является хоткеем только в средине программы! Хоть это было не особо важно, но бесило конкретно!
На счет TIDY немного не понял... она улучшает читаемость кода или просто проверяет на сколько он читаемый? На первый взгляд в коде изменений не увидел, но скажу честно... особо не всматривался... Благодарю за помощь!
 
Верх