Что нового

Программа для регистрации поступившего оборудования

Genics

Новичок
Сообщения
39
Репутация
0
Версия AutoIt: v3.3.10.2
ОС: Windows7 x64

Описание:
Нужна программа для регистрации поступившего оборудования, с сохранением в базе данных SQLite3. Самое главное реализовать удобный поиск в массиве БД сохраненной информации. Кто сможет реализовать, буду премного благодарен.

Описание интерфейса пользователя
Есть форма с элементами управления сделанная в Koda FormDesigner, сгенерированный код прилагается во вложенном файле.

Необходимо сделать программу для ВВОДА данных в базу данных SQLite3 (файл DB_DATA.db -для просмотра и работы с ней использую SQLite Expert Personal 3) и ВЫВОДА в этой же форме через поиск нажатием кнопки «П». При этом может открываться дополнительное окно, для выбора пользователем одного из нескольких найденных вариантов. Выбранный вариант отображается в полях данной формы.

Форма имеет следующие элементы управления и их типы:
----
Кнопка «Новая запись». [нужна для создания новой записи (строки), которого еще нет в базе данных ]
При ее нажатии индикатор «номер записи» должен отобразить значение последний номер записи в базе + 1; (что бы пользователь не думал о номерах и какой там последний а просто нажал на кнопку «Новая запись» )
----
Поле «номер записи».
Возможности: ввод, вывод, поиск.
Числовое поле (целое, и желательно длинное), уникальный не повторяемый.
При запуске программы отображает последний номер записи в базе.
При нажатии кнопок «/\» «\/» номер уменьшается или увеличивается на 1 считывая данные из базы.
Если ввести номер который уже есть в БД и нажать на «П», программа произведет поиск и выведет данные из БД в элем.упр. Если номера нет, выводит сообщение что записи с таким номером нет.

Еще нужно добавить файл File_Nomer_zapisi.dat (файл вложен).
При любом выводе-изменении значения поля номера записи (но не при вводе поискового запроса), в текстовом файле File_Nomer_zapisi.dat (обязательно с расширением *.dat ) тоже происходит перезапись:
A000 123456
т. е. поле в форме и строка в файле имеют всегда одно значение, A000 и пробел не меняются.
----
Поле «Дата создания».
Возможности: только вывод.
Из БД при поиске , при нажатии кнопки «Новая запись» отображается текущая дата.
Эта дата сохраняется в базу как и все данные при нажатии кнопки «Сохранить».
----
Поле «Пользователь»
Возможности: ввод в БД, вывод из БД.
Текстовое поле отображает ФИО пользователя (пример: Иванов И. И.)
Так как пользователей мало, желательно иметь возможность вводить в это поле как вручную так и через выпадающий список, в котором отображаются выпадая все введенные пользователи. Пользователей допускаю сохранять отдельно в .ini файле.
----
Поле «Должность»
Все тоже самое что и Поле «Пользователь»
----
Поле «Название»
Возможности: ввод в БД, вывод из БД, поиск
Текстовое поле
----
Поле «Модель»
Возможности: ввод в БД, вывод из БД, поиск
Текстовое поле
----
Поле «Номер»
Возможности: ввод в БД, вывод из БД, поиск
Текстовое поле
----
Поле «Владелец»
Возможности: ввод в БД, вывод из БД, поиск
Текстовое поле
----
Поле «Адрес владельца»
Возможности: ввод в БД, вывод из БД
Текстовое поле
----
Поле «Комментарий»
Возможности: ввод в БД, вывод из БД
Текстовое поле
----
Кнопка «Сохранить»
При ее нажатии происходит сохранение данных отображаемых в полях элем.упр. под новым «номером записи»
----
 

Вложения

  • Форма.png
    Форма.png
    19.7 КБ · Просмотры: 60
  • Kod_Form.au3
    3 КБ · Просмотры: 7
  • Файлы db и dat.rar
    407 байт · Просмотры: 18

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
247
Если ещё актуально, вот что наваял :smile:
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <File.au3>
#include <SQLite.au3>
#include <Array.au3>
#include <GuiComboBox.au3>
#include <GuiListView.au3>

If Not FileExists(@ScriptDir & '/DB_DATA.db') Then
    MsgBox(48, 'Ошибка !', 'Не найден файл базы данных !' & @CRLF & 'DB_DATA.db', 3)
    Exit
EndIf

If Not FileExists(@ScriptDir & '/File_Nomer_zapisi.dat') Then
    MsgBox(48, 'Ошибка !', 'Не найден файл базы данных !' & @CRLF & 'File_Nomer_zapisi.dat', 3)
    Exit
EndIf

$IniFile = @ScriptDir & '/Users.ini'
If Not FileExists($IniFile) Then _FileCreate($IniFile)

#Region ### START Koda GUI section ### Form=d:\7 ДЕЛА\РАБ Техзадание на БД ЭУ3\Форма БД Заказчиков\form1.kxf

$Form1_1 = GUICreate("Form1", 618, 478, 866, 325)
$Button1 = GUICtrlCreateButton("Новая запись", 8, 8, 97, 49)
$Label1 = GUICtrlCreateLabel("Номер записи", 112, 24, 117, 20, $SS_CENTER)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xFFFFE1)

$Button2 = GUICtrlCreateButton("/\", 344, 8, 25, 25)
$Button3 = GUICtrlCreateButton("\/", 344, 32, 25, 25)
$Label2 = GUICtrlCreateLabel("Дата создания", 384, 24, 114, 20, $SS_CENTER)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xA6CAF0)
$Label3 = GUICtrlCreateLabel("", 504, 26, 99, 17, $SS_CENTER)
GUICtrlSetBkColor(-1, 0xFFFFFF)
$Label4 = GUICtrlCreateLabel("Пользователь", 8, 80, 111, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xA6CAF0)
$Label5 = GUICtrlCreateLabel(" Должность", 328, 80, 88, 20, $SS_CENTER)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xA6CAF0)
$Label6 = GUICtrlCreateLabel("Название", 8, 128, 102, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xFFFFE1)
$Label7 = GUICtrlCreateLabel("Модель", 8, 168, 100, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xFFFFE1)
$Label8 = GUICtrlCreateLabel("Номер", 8, 208, 100, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xFFFFE1)
$Label9 = GUICtrlCreateLabel(" Владелец", 8, 248, 97, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xFFFFE1)
$Label10 = GUICtrlCreateLabel("Адрес владельца", 8, 288, 605, 20, $SS_CENTER)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xA6CAF0)
$Label11 = GUICtrlCreateLabel("Коментарий", 8, 352, 606, 20, $SS_CENTER)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xA6CAF0)

$Input2 = GUICtrlCreateCombo("", 128, 80, 165, 21) ;Пользователь
$Add_User = GUICtrlCreateButton('+', 294, 70, 20, 20)
$Dell_User = GUICtrlCreateButton('-', 294, 91, 20, 20)
$User_ini = IniReadSection($IniFile, 'Пользователь')

If IsArray($User_ini) Then

  For $i = 1 To $User_ini[0][0]
    GUICtrlSetData($Input2, $User_ini[$i][0], $User_ini[1][0])
  Next

EndIf

$Input3 = GUICtrlCreateCombo("", 424, 80, 165, 21) ;должность
$Add_Post = GUICtrlCreateButton('+', 590, 70, 20, 20)
$Dell_Post = GUICtrlCreateButton('-', 590, 91, 20, 20)
$Post_ini = IniReadSection($IniFile, 'Должность')

If IsArray($Post_ini) Then
   For $i = 1 To $Post_ini[0][0]
      GUICtrlSetData($Input3, $Post_ini[$i][0], $Post_ini[1][0])
   Next
EndIf

$Input1 = GUICtrlCreateInput("", 232, 24, 81, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER)) ;Номер записи
$Input4 = GUICtrlCreateInput("", 112, 128, 473, 21) ;название
$Input5 = GUICtrlCreateInput("", 112, 168, 473, 21) ;модель
$Input6 = GUICtrlCreateInput("", 112, 208, 473, 21) ;Номер
$Input7 = GUICtrlCreateInput("", 112, 248, 473, 21) ;Владелец
$Input8 = GUICtrlCreateInput("", 8, 312, 603, 21) ;Адрес владельца
$Input9 = GUICtrlCreateInput("", 8, 376, 603, 21) ;Коментарий
$Button4 = GUICtrlCreateButton("П", 312, 22, 25, 25)
$Button5 = GUICtrlCreateButton("П", 584, 126, 25, 25)
$Button6 = GUICtrlCreateButton("П", 584, 166, 25, 25)
$Button9 = GUICtrlCreateButton("П", 584, 206, 25, 25)
$Button10 = GUICtrlCreateButton("П", 584, 246, 25, 25)
$Button7 = GUICtrlCreateButton("Сохранить", 256, 416, 105, 41)
GUISetState(@SW_SHOW)

#EndRegion ### END Koda GUI section ###

_SQLite_Startup() ; Загружаем "SQLite3.dll"
If @error > 0 Then Exit MsgBox(16, 'SQLite Ошибка', 'SQLite.dll Не может быть загружен!')
Global $dbn = _SQLite_Open('DB_DATA.db') ; Открываем БД

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $Button10 ; Поиск по владельцу
            $Zapros = "SELECT * FROM TABLE_DATA WHERE ARG_Vladelec='" & GUICtrlRead($Input7) & "'"
            $Text = 'Владелец ' & GUICtrlRead($Input7) & ' не найден !'
            _Search($Zapros, $Text)

        Case $Button9 ; Поиск по номеру
            $Zapros = "SELECT * FROM TABLE_DATA WHERE ARG_Nomer='" & GUICtrlRead($Input6) & "'"
            $Text = 'Номер ' & GUICtrlRead($Input6) & ' не найден !'
            _Search($Zapros, $Text)

        Case $Button6 ; Поиск по Модели

            $Zapros = "SELECT * FROM TABLE_DATA WHERE ARG_Model='" & GUICtrlRead($Input5) & "'"
            $Text = 'Модель ' & GUICtrlRead($Input5) & ' не найдена !'
            _Search($Zapros, $Text)

        Case $Button5 ; Поиск по Названию

            $Zapros = "SELECT * FROM TABLE_DATA WHERE ARG_Naimenovanie='" & GUICtrlRead($Input4) & "'"
            $Text = 'Название ' & GUICtrlRead($Input4) & ' не найдено !'
            _Search($Zapros, $Text)

        Case $Button4 ; Поиск по номеру записи

            $Zapros = "SELECT * FROM TABLE_DATA WHERE ARG_Nomer_Zapisi='" & GUICtrlRead($Input1) & "'"
            $Text = 'Номер ' & GUICtrlRead($Input1) & ' не найден!'
            _Search($Zapros, $Text)

        Case $Button2 ; Номер плюс
            GUICtrlSetData($Input1, GUICtrlRead($Input1) + 1)

        Case $Button3 ; Номер минус
            If GUICtrlRead($Input1) - 1 > 0 Then GUICtrlSetData($Input1, GUICtrlRead($Input1) - 1)

        Case $Button1 ;Новая запись

            _NewRecord()
        Case $Button7 ; Сохранить
            _Save()

        Case $GUI_EVENT_CLOSE
            _Exit()

        Case $Add_User ;Новый пользователь
            _AddUser()

        Case $Dell_User ; Удалить пользователя
            $Del_User = GUICtrlRead($Input2)
            If MsgBox(48 + 1, 'Внимание !', 'Вы уверены, что хотите удалить пользователя' & @CRLF & $Del_User & '?') = 1 Then
                IniDelete($IniFile, 'Пользователь', $Del_User)
                _GUICtrlComboBox_DeleteString($Input2, _GUICtrlComboBox_FindString($Input2, $Del_User))
            EndIf

        Case $Add_Post ;Добавить должность
            _AddPost()

        Case $Dell_Post ; Удалить должность
            $Del_Post = GUICtrlRead($Input3)
            If MsgBox(48 + 1, 'Внимание !', 'Вы уверены, что хотите удалить должность' & @CRLF & $Del_Post & '?') = 1 Then
                IniDelete($IniFile, 'Должность', $Del_Post)
                _GUICtrlComboBox_DeleteString($Input3, _GUICtrlComboBox_FindString($Input3, $Del_Post))
            EndIf

    EndSwitch
WEnd

Func _Save()
    Local $aResult, $iRows, $iColumns

    $iRval = _SQLite_GetTable2d($dbn, "SELECT * FROM TABLE_DATA WHERE ARG_Nomer_Zapisi='" & GUICtrlRead($Input1) & "'", $aResult, $iRows, $iColumns) ; возвращает двумерный массив в $aResult
    If $iRval = $SQLITE_OK Then
        If UBound($aResult) > 1 Then ;Обновление записи, если номер уже есть в базе
            $TextZaprosa = "UPDATE TABLE_DATA SET ARG_User='" & GUICtrlRead($Input2) & "',ARG_Doljnost='" & GUICtrlRead($Input3) & "',ARG_Naimenovanie='" & GUICtrlRead($Input4) & "',ARG_Model='" & GUICtrlRead($Input5) & "',ARG_Nomer='" & GUICtrlRead($Input6) & "',ARG_Vladelec='" & GUICtrlRead($Input7) & "',ARG_Adres='" & GUICtrlRead($Input8) & "',ARG_Comments='" & GUICtrlRead($Input9) & "'  WHERE ARG_Nomer_Zapisi=" & GUICtrlRead($Input1) & ";"

            If Not _SQLite_Exec($dbn, $TextZaprosa) = $SQLITE_OK Then
                MsgBox(16, 'SQLite Ошибка', _SQLite_ErrMsg())
                _Exit()
            EndIf

        Else ;Сохранение записи в базу, если номер записи новый
            If Not _SQLite_Exec($dbn, "INSERT INTO TABLE_DATA VALUES ('" & GUICtrlRead($Input1) & "','" & @MDAY & "','" & @MON & "','" & @YEAR & "','" & GUICtrlRead($Input2) & "','" & GUICtrlRead($Input3) & "','" & GUICtrlRead($Input4) & "','" & GUICtrlRead($Input5) & "','" & GUICtrlRead($Input6) & "','" & GUICtrlRead($Input7) & "','" & GUICtrlRead($Input8) & "','" & GUICtrlRead($Input9) & "');") = $SQLITE_OK Then
                MsgBox(16, 'SQLite Ошибка', _SQLite_ErrMsg())
                _Exit()
            EndIf
        EndIf

    Else
        MsgBox(16, "Ошибка SQLite: " & $iRval, _SQLite_ErrMsg())
    EndIf
EndFunc   ;==>_Save

Func _AddPost()
    $NewPost = GUICtrlRead($Input3)
    $SavePost = 1
    ; Проверка, что введенной должности нет в ини файле
    $Post_ini = IniReadSection($IniFile, 'Должность')

If IsArray($Post_ini) Then
    For $i = 1 To $Post_ini[0][0]
        If $NewPost = $Post_ini[$i][0] Then
            $SavePost = 0
            ExitLoop
        EndIf
    Next
EndIf

    If $SavePost Then
        IniWrite($IniFile, 'Должность', $NewPost, '')
        GUICtrlSetData($Input3, $NewPost, $NewPost)
    Else
        MsgBox(48, 'Ошибка !', 'Должность ' & $NewPost & @CRLF & 'уже существует !')
    EndIf

EndFunc   ;==>_AddPost

Func _Search($Zapros, $Text)

    Local $aResult, $iRows, $iColumns

    $iRval = _SQLite_GetTable2d($dbn, $Zapros, $aResult, $iRows, $iColumns) ; возвращает двумерный массив в $aResult
    If $iRval = $SQLITE_OK Then
        If UBound($aResult) = 2 Then

            GUICtrlSetData($Label3, $aResult[1][1] & ' ' & _Month($aResult[1][2]) & ' ' & $aResult[1][3])
            GUICtrlSetData($Input2, $aResult[1][4])
            GUICtrlSetData($Input3, $aResult[1][5])
            GUICtrlSetData($Input4, $aResult[1][6])
            GUICtrlSetData($Input5, $aResult[1][7])
            GUICtrlSetData($Input6, $aResult[1][8])
            GUICtrlSetData($Input7, $aResult[1][9])
            GUICtrlSetData($Input8, $aResult[1][10])
            GUICtrlSetData($Input9, $aResult[1][11])
        ElseIf UBound($aResult) > 2 Then
            _Select($aResult, $Form1_1)

        Else
            MsgBox(16, "Ошибка поиска", $Text)
        EndIf

    Else
        MsgBox(16, "Ошибка SQLite: " & $iRval, _SQLite_ErrMsg())
    EndIf

EndFunc   ;==>_Search

Func _AddUser()

    $NewUser = GUICtrlRead($Input2)
    $Save = 1
    ; Проверка, что введенного имени пользователя нет в ини файле
    $User_ini = IniReadSection($IniFile, 'Пользователь')

If IsArray($User_ini) Then
    For $i = 1 To $User_ini[0][0]
        If $NewUser = $User_ini[$i][0] Then
            $Save = 0
            ExitLoop
        EndIf
    Next
EndIf

    If $Save Then
        IniWrite($IniFile, 'Пользователь', $NewUser, '')
        GUICtrlSetData($Input2, $NewUser, $NewUser)
    Else
        MsgBox(48, 'Ошибка !', 'пользователь с именем ' & $NewUser & @CRLF & 'уже существует !')
    EndIf

EndFunc   ;==>_AddUser

Func _Select($Array, $hParent = 0)

    Local $hSettings, $iGOEM_Opt

    ;Предотвращение проблем в случае если главный GUI использует режим событий
    $iGOEM_Opt = Opt("GUIOnEventMode", 0)

    $hSettings_GUI = GUICreate('Выбор позиции', 900, 300, -1, -1, -1, -1, $hParent)

    $LV = GUICtrlCreateListView('Номер записи|Дата Создания|Пользователь|Должность|Название|Модель|Номер|Владелец|Адрес владельца|Коментарий', 5, 5, 890, 250, Default, BitOR($LVS_EX_CHECKBOXES, $LVS_EX_GRIDLINES))

    For $i = 1 To UBound($Array) - 1
        $LV_Item = _GUICtrlListView_AddItem($LV, $Array[$i][0], $i - 1)
        _GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][1] & ' ' & _Month($Array[$i][2]) & ' ' & $Array[$i][3], 1)
        _GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][4], 2)
        _GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][5], 3)
        _GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][6], 4)
        _GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][7], 5)
        _GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][8], 6)
        _GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][9], 7)
        _GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][10], 8)
        _GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][11], 9)

    Next

    $But_OK = GUICtrlCreateButton('Выбор', 20, 260, 150, 35)
    GUISetState(@SW_DISABLE, $hParent)
    GUISetState(@SW_SHOW, $hSettings_GUI)

    While 1
        $nMsg = GUIGetMsg()

        Switch $nMsg
            Case $GUI_EVENT_CLOSE
                ExitLoop
            Case $But_OK
                $Index = -1
                For $i = 0 To _GUICtrlListView_GetItemCount($LV)
                    If _GUICtrlListView_GetItemChecked($LV, $i) Then
                        $Index = $i
                        ExitLoop
                    EndIf
                Next

                If $Index = -1 Then
                    MsgBox(48, 'Внимание !', 'Не выбрано ни одного пункта !', 3)
                Else
                    GUICtrlSetData($Input1, $Array[$Index + 1][0])
                    GUICtrlSetData($Label3, $Array[$Index + 1][1] & ' ' & _Month($Array[$Index + 1][2]) & ' ' & $Array[$Index + 1][3])
                    GUICtrlSetData($Input2, $Array[$Index + 1][4])
                    GUICtrlSetData($Input3, $Array[$Index + 1][5])
                    GUICtrlSetData($Input4, $Array[$Index + 1][6])
                    GUICtrlSetData($Input5, $Array[$Index + 1][7])
                    GUICtrlSetData($Input6, $Array[$Index + 1][8])
                    GUICtrlSetData($Input7, $Array[$Index + 1][9])
                    GUICtrlSetData($Input8, $Array[$Index + 1][10])
                    GUICtrlSetData($Input9, $Array[$Index + 1][11])

                    ExitLoop

                EndIf

        EndSwitch
    WEnd

    Opt("GUIOnEventMode", $iGOEM_Opt)
    GUISetState(@SW_ENABLE, $hParent)
    GUIDelete($hSettings_GUI)

EndFunc   ;==>_Select

Func _NewRecord()

    Local $aResult, $iRows, $iColumns

    $iRval = _SQLite_GetTable2d($dbn, "SELECT ARG_Nomer_Zapisi FROM TABLE_DATA;", $aResult, $iRows, $iColumns) ; возвращает двумерный массив в $aResult
    If $iRval = $SQLITE_OK Then
        Local $NewNumber = _ArrayMax($aResult, 1) + 1
        GUICtrlSetData($Input1, $NewNumber)
        ;_ArrayDisplay($aResult)
    Else
        MsgBox(16, "Ошибка SQLite: " & $iRval, _SQLite_ErrMsg())
    EndIf

    Local $NewData = @MDAY & ' ' & _Month(@MON) & ' ' & @YEAR
    GUICtrlSetData($Label3, $NewData)

EndFunc   ;==>_NewRecord

Func _Month($Number)
    Switch $Number
        Case 1
            Return 'Января'
        Case 2
            Return 'Февраля'
        Case 3
            Return 'Марта'
        Case 4
            Return 'Апреля'
        Case 5
            Return 'Мая'
        Case 6
            Return 'Июня'
        Case 7
            Return 'Июля'
        Case 8
            Return 'Августа'
        Case 9
            Return 'Сентября'
        Case 10
            Return 'Октября'
        Case 11
            Return 'Ноября'
        Case 12
            Return 'Декабря'
    EndSwitch

EndFunc   ;==>_Month

Func _Exit() ; Выход
    _SQLite_Close()
    _SQLite_Shutdown()
    Exit
EndFunc   ;==>_Exit

Только вот это
Еще нужно добавить файл File_Nomer_zapisi.dat (файл вложен).
При любом выводе-изменении значения поля номера записи (но не при вводе поискового запроса), в текстовом файле File_Nomer_zapisi.dat (обязательно с расширением *.dat ) тоже происходит перезапись:
A000 123456
т. е. поле в форме и строка в файле имеют всегда одно значение, A000 и пробел не меняются.
я не делал, так как не понял , что нужно.
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
OffTopic:
ra4o
просто кошмарный вид у кода. то строки одна за другой, то через одну. размеры отступов ...
ты, хотя бы, Tidy пользуйся
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
247
Сорри за код, Tiddy попытался запустить, а его нет в данной версии AutoIt, отдельно не нашёл :(
Переустановил , нашёл Tiddy, лучше стало ? :smile:
 
Автор
G

Genics

Новичок
Сообщения
39
Репутация
0
Вот так сюрприз! :smile:
А я подумал, что зря сочинял задание и никого оно не заинтересовало.
Благодарю тебя ra4o за труд!
Запускал прогу, немного потестил. Выявил не совсем корректную работу программы. Ну может это я не как надо описал ее работу. Все равно спасибо. Попробую разобраться в коде.
:IL_AutoIt_1:
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
247
Я сам только учусь, так , что простите за корявый код :-[ Если есть вопросы по коду - охотно отвечу.
Еще нужно добавить файл File_Nomer_zapisi.dat
По этому вопросу ничего не делал, так как не понял, что нужно.
 
Автор
G

Genics

Новичок
Сообщения
39
Репутация
0
ra4o все нормально, я не различаю корявость кода ;D.

По поводу файла [File_Nomer_zapisi.dat] все просто. В нем должен повторятся в режиме реального времени, номер который отображается в поле «Номер записи». Но только не в момент ввода пользователем номера для поиска. А только тогда когда программа нашла его и вывела.
Это нужно для синхронизации работы другой программы, у нее тоже своя база. И она должна знать, с какой строкой в базе происходит работа в данный момент времени. Вот и считает нужный ей номер из файла [File_Nomer_zapisi.dat]. У этого файла есть свое форматирование: A000 123456
А – это значит аргумент; 000- номер аргумента; потом идет пробел;
Это все у файла не меняется. Дальше идет номер записи, он то и должен переписываться.

Если есть желание подкорректировать код, прилагаю:
Перечень ошибок в работе программы выявленных при первом тестировании.
[list type=decimal]
[*]При первом запуске и попытке сохранения данных в базу почему то было создано три сроки записи: 1; 2; 1
Я не помню, какие мои действия привели к такому результату, но вот так.
При повторном перезапуске программы с нуля, все сработало правильно, была создана одна строка в базе.
[*]После первой записи если нажать на кнопку «Новая запись» в поле «Номер записи» Должно появиться значение 2 (это было в условии задания), но оно не появляется. В поле «Номер записи» остается 1. Да стрелочки срабатывают ими я и воспользовался, но они мне не для этого были нужны, а для поиска нужной записи если она была сделана недавно. Если пользователь помнит что он делал нужную запись пару дней назад, тогда он просто перемотает нажимая «стрелку вниз» и найдет ее. А вот кнопка «Новая запись» как раз и должна увеличивать значение, но только на единицу больше чем номер последней записи.
[*]После второй записи если нажать на кнопку «Новая запись» в поле «Номер записи» Должно появиться значение 3, но появляется опять 1. А при нажатии кнопки «Сохранить» происходит перезапись 1-й строки в базе с удалением старой записи. Такого происходить не должно, программа не должна ничего удалять а только сохранять, искать и выводить информацию из базы. Нельзя пользователям давать такую возможность иначе они все поудаляют :smile:. Удалять некорректные записи я планирую через SQLite Expert Personal.
[*]После второй записи (когда произошла перезапись первой записи) в файле Users.ini не сохранились «Пользователь» и «Должность». И вообще там ничего не сохраняется почему то?! Получается при запуске программа считывает оттуда значения и удаляет? А можно сделать чтобы только записывала а удалять я буду сам через текстовый редактор Блокнот. Или она берет их из Базы? Но тогда зачем файл Users.ini?
После закрытия программы, повторном запуске и поиске, все записи находит но не выводит «Пользователь» и «Должность».
[*]При попытке поиска по названию поиск прошел успешно, только при выводе поле «Номер записи» не поменяло своего значения, ведь пользователь ищет не только данные но и номер под которым они записаны. Еще надо бы, чтобы поиск не учитывал регистр букв, иначе если ввести [корпус] а в базе есть [Корпус] она его не находит. Так должно быть во всех полях где возможен поиск.
[/list]
В заключении прилагаю файл с тестовой базой [DB_DATA.db]
 

Вложения

  • DB_DATA.zip
    789 байт · Просмотры: 7

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
247
QL

Я так понимаю - изменять запись в базе нельзя, можно только добавлять новую запись ? По поводу Users.ini : список пользователей и должностей составляет пользователь - для добавления записи нужно набрать в поле имя (должность) и после клавишу "+", новая должность (фамилия) добавится в файл Users.ini и появится в соответствующем "Combo" , для удаления выбрать из выпадающего списка нужную запись и "-".
Что должно отображаться в полях при первом запуске ? Сейчас всё пусто, если нажать "Новая запись " в поле с номером записи - максимальный номер в базе +1
Еще надо бы, чтобы поиск не учитывал регистр букв
к сожалению в SQLite есть проблемы с регистронезависимым поиском НЕ латинских символов (запрос с "LIKE" на кириллицу не реагирует). Если в базе записи ВСЕГДА с большой буквы - это можно реализовать изменяя введенное слово в соотв. "Input"... Если база не большая можно подойти к вопросу несколько иначе - читать всю базу в массив и дальше работать с массивом, таким образом можно победить это ограничение...

Изменил, отказался от файла Users.ini - данные берутся из базы, попытка записи в базу со значением номера записи которое существует - приведёт к ошибке. С обработкой кнопки «Новая запись» пока ничего не делал, пробовал разные варианты - всё срабатывало корректно.
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <File.au3>
#include <SQLite.au3>
#include <Array.au3>
#include <GuiComboBox.au3>
#include <GuiListView.au3>

If Not FileExists(@ScriptDir & '/DB_DATA.db') Then
    MsgBox(48, 'Ошибка !', 'Не найден файл базы данных !' & @CRLF & 'DB_DATA.db', 3)
    Exit
EndIf

Global $sPathFile = @ScriptDir & '/File_Nomer_zapisi.dat'
If Not FileExists($sPathFile) Then
    MsgBox(48, 'Ошибка !', 'Не найден файл базы данных !' & $sPathFile, 3)
    Exit
EndIf


#Region ### START Koda GUI section ### Form=d:\7 ДЕЛА\РАБ Техзадание на БД ЭУ3\Форма БД Заказчиков\form1.kxf

$Form1_1 = GUICreate("Form1", 618, 478)
$Button1 = GUICtrlCreateButton("Новая запись", 8, 8, 97, 49)
$Label1 = GUICtrlCreateLabel("Номер записи", 112, 24, 117, 20, $SS_CENTER)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xFFFFE1)

$Button2 = GUICtrlCreateButton("/\", 344, 8, 25, 25)
$Button3 = GUICtrlCreateButton("\/", 344, 32, 25, 25)
$Label2 = GUICtrlCreateLabel("Дата создания", 384, 24, 114, 20, $SS_CENTER)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xA6CAF0)
$Label3 = GUICtrlCreateLabel("", 504, 26, 99, 17, $SS_CENTER)
GUICtrlSetBkColor(-1, 0xFFFFFF)
$Label4 = GUICtrlCreateLabel("Пользователь", 8, 80, 111, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xA6CAF0)
$Label5 = GUICtrlCreateLabel(" Должность", 328, 80, 88, 20, $SS_CENTER)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xA6CAF0)
$Label6 = GUICtrlCreateLabel("Название", 8, 128, 102, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xFFFFE1)
$Label7 = GUICtrlCreateLabel("Модель", 8, 168, 100, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xFFFFE1)
$Label8 = GUICtrlCreateLabel("Номер", 8, 208, 100, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xFFFFE1)
$Label9 = GUICtrlCreateLabel(" Владелец", 8, 248, 97, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xFFFFE1)
$Label10 = GUICtrlCreateLabel("Адрес владельца", 8, 288, 605, 20, $SS_CENTER)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xA6CAF0)
$Label11 = GUICtrlCreateLabel("Коментарий", 8, 352, 606, 20, $SS_CENTER)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xA6CAF0)

$Input2 = GUICtrlCreateCombo("", 128, 80, 165, 21) ;Пользователь


$Input3 = GUICtrlCreateCombo("", 424, 80, 165, 21) ;должность


$Input1 = GUICtrlCreateInput("", 232, 24, 81, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER)) ;Номер записи
$Input4 = GUICtrlCreateInput("", 112, 128, 473, 21) ;название
$Input5 = GUICtrlCreateInput("", 112, 168, 473, 21) ;модель
$Input6 = GUICtrlCreateInput("", 112, 208, 473, 21) ;Номер
$Input7 = GUICtrlCreateInput("", 112, 248, 473, 21) ;Владелец
$Input8 = GUICtrlCreateInput("", 8, 312, 603, 21) ;Адрес владельца
$Input9 = GUICtrlCreateInput("", 8, 376, 603, 21) ;Коментарий
$Button4 = GUICtrlCreateButton("П", 312, 22, 25, 25)
$Button5 = GUICtrlCreateButton("П", 584, 126, 25, 25)
$Button6 = GUICtrlCreateButton("П", 584, 166, 25, 25)
$Button9 = GUICtrlCreateButton("П", 584, 206, 25, 25)
$Button10 = GUICtrlCreateButton("П", 584, 246, 25, 25)
$Button7 = GUICtrlCreateButton("Сохранить", 256, 416, 105, 41)
GUISetState(@SW_SHOW)

#EndRegion ### END Koda GUI section ###

_SQLite_Startup() ; Загружаем "SQLite3.dll"
If @error > 0 Then Exit MsgBox(16, 'SQLite Ошибка', 'SQLite.dll Не может быть загружен!')
Global $dbn = _SQLite_Open('DB_DATA.db') ; Открываем БД

Local $aResult, $iRows, $iColumns
;Поиск из базы всех Пользователей
$iRval = _SQLite_GetTable2d($dbn, "SELECT ARG_User FROM TABLE_DATA ", $aResult, $iRows, $iColumns) ; возвращает двумерный массив в $aResult
$aUser = _ArrayUnique($aResult)
For $i = 2 To UBound($aUser) - 1
    _GUICtrlComboBox_AddString($Input2, $aUser[$i])
Next

;Поиск из базы всех должностей
$iRval = _SQLite_GetTable2d($dbn, "SELECT ARG_Doljnost FROM TABLE_DATA ", $aResult, $iRows, $iColumns) ; возвращает двумерный массив в $aResult
$aPost = _ArrayUnique($aResult)
For $i = 2 To UBound($aPost) - 1
    _GUICtrlComboBox_AddString($Input3, $aPost[$i])
Next

;Поиск максимального номера в базе и заполнение всех полей даннымим при первом запуске
$iRval = _SQLite_GetTable2d($dbn, "SELECT ARG_Nomer_Zapisi FROM TABLE_DATA ", $aResult, $iRows, $iColumns)
   $MaxNumber = _ArrayMax($aResult, 1)
   $Zapros = "SELECT * FROM TABLE_DATA WHERE ARG_Nomer_Zapisi='" & $MaxNumber & "'"
   $Text = 'Ошибка чтения из базы номера ' & $MaxNumber & ' !'
   _Search($Zapros, $Text)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $Button10 ; Поиск по владельцу
            $Zapros = "SELECT * FROM TABLE_DATA WHERE ARG_Vladelec='" & GUICtrlRead($Input7) & "'"
            $Text = 'Владелец ' & GUICtrlRead($Input7) & ' не найден !'
            _Search($Zapros, $Text)

        Case $Button9 ; Поиск по номеру
            $Zapros = "SELECT * FROM TABLE_DATA WHERE ARG_Nomer='" & GUICtrlRead($Input6) & "'"
            $Text = 'Номер ' & GUICtrlRead($Input6) & ' не найден !'
            _Search($Zapros, $Text)

        Case $Button6 ; Поиск по Модели

            $Zapros = "SELECT * FROM TABLE_DATA WHERE ARG_Model='" & GUICtrlRead($Input5) & "'"
            $Text = 'Модель ' & GUICtrlRead($Input5) & ' не найдена !'
            _Search($Zapros, $Text)

        Case $Button5 ; Поиск по Названию

            $Zapros = "SELECT * FROM TABLE_DATA WHERE  ARG_Naimenovanie ='" & GUICtrlRead($Input4) & "'"
            $Text = 'Название ' & GUICtrlRead($Input4) & ' не найдено !'
            _Search($Zapros, $Text)

        Case $Button4 ; Поиск по номеру записи

            $Zapros = "SELECT * FROM TABLE_DATA WHERE ARG_Nomer_Zapisi='" & GUICtrlRead($Input1) & "'"
            $Text = 'Номер ' & GUICtrlRead($Input1) & ' не найден!'
            _Search($Zapros, $Text)

        Case $Button2 ; Номер плюс
            GUICtrlSetData($Input1, GUICtrlRead($Input1) + 1)

        Case $Button3 ; Номер минус
            If GUICtrlRead($Input1) - 1 > 0 Then GUICtrlSetData($Input1, GUICtrlRead($Input1) - 1)

        Case $Button1 ;Новая запись

            _NewRecord()
        Case $Button7 ; Сохранить
            _Save()

        Case $GUI_EVENT_CLOSE
            _Exit()


    EndSwitch
WEnd

Func _Save()
    Local $aResult, $iRows, $iColumns

    $iRval = _SQLite_GetTable2d($dbn, "SELECT * FROM TABLE_DATA WHERE ARG_Nomer_Zapisi='" & GUICtrlRead($Input1) & "'", $aResult, $iRows, $iColumns) ; возвращает двумерный массив в $aResult
    If $iRval = $SQLITE_OK Then
        If UBound($aResult) > 1 Then ; если номер уже есть в базе
            MsgBox(48, 'Ошибка !', 'Запись с номером ' & GUICtrlRead($Input1) & ' уже существует в базе' & @CRLF & 'и не может быть перезаписана !')

        Else ;Сохранение записи в базу, если номер записи новый
            If Not _SQLite_Exec($dbn, "INSERT INTO TABLE_DATA VALUES ('" & GUICtrlRead($Input1) & "','" & @MDAY & "','" & @MON & "','" & @YEAR & "','" & GUICtrlRead($Input2) & "','" & GUICtrlRead($Input3) & "','" & GUICtrlRead($Input4) & "','" & GUICtrlRead($Input5) & "','" & GUICtrlRead($Input6) & "','" & GUICtrlRead($Input7) & "','" & GUICtrlRead($Input8) & "','" & GUICtrlRead($Input9) & "');") = $SQLITE_OK Then
                MsgBox(16, 'SQLite Ошибка', _SQLite_ErrMsg())
                _Exit()
            EndIf
            ;Запись нового пользователя в $Input2, если его там нет
            If _ArraySearch($aUser, GUICtrlRead($Input2)) < 0 Then
                _ArrayAdd($aUser, GUICtrlRead($Input2))
                _GUICtrlComboBox_AddString($Input2, GUICtrlRead($Input2))
            EndIf

            ;Запись новой должности в $Input3, если её там нет
            If _ArraySearch($aPost, GUICtrlRead($Input3)) < 0 Then
                _ArrayAdd($aUser, GUICtrlRead($Input3))
                _GUICtrlComboBox_AddString($Input3, GUICtrlRead($Input3))
            EndIf

        EndIf

    Else
        MsgBox(16, "Ошибка SQLite: " & $iRval, _SQLite_ErrMsg())
    EndIf
EndFunc   ;==>_Save


Func _Search($Zapros, $Text)

    Local $aResult, $iRows, $iColumns

    $iRval = _SQLite_GetTable2d($dbn, $Zapros, $aResult, $iRows, $iColumns) ; возвращает двумерный массив в $aResult
    If $iRval = $SQLITE_OK Then
        If UBound($aResult) = 2 Then
            ;_ArrayDisplay($aResult)
            GUICtrlSetData($Input1, $aResult[1][0])
            GUICtrlSetData($Label3, $aResult[1][1] & ' ' & _Month($aResult[1][2]) & ' ' & $aResult[1][3])
            GUICtrlSetData($Input2, $aResult[1][4])
            GUICtrlSetData($Input3, $aResult[1][5])
            GUICtrlSetData($Input4, $aResult[1][6])
            GUICtrlSetData($Input5, $aResult[1][7])
            GUICtrlSetData($Input6, $aResult[1][8])
            GUICtrlSetData($Input7, $aResult[1][9])
            GUICtrlSetData($Input8, $aResult[1][10])
            GUICtrlSetData($Input9, $aResult[1][11])
        ElseIf UBound($aResult) > 2 Then
            _Select($aResult, $Form1_1)

        Else
            MsgBox(16, "Ошибка поиска", $Text)
        EndIf
        ;Запись результата в файл File_Nomer_zapisi.dat
        $hFile = FileOpen($sPathFile, 2)
        FileWrite($hFile,  StringFormat("A000 %d\n", GUICtrlRead($Input1) ))
        FileClose($hFile)


    Else
        MsgBox(16, "Ошибка SQLite: " & $iRval, _SQLite_ErrMsg())
    EndIf

EndFunc   ;==>_Search


Func _Select($Array, $hParent = 0)

    Local $hSettings, $iGOEM_Opt

    ;Предотвращение проблем в случае если главный GUI использует режим событий
    $iGOEM_Opt = Opt("GUIOnEventMode", 0)

    $hSettings_GUI = GUICreate('Выбор позиции', 900, 300, -1, -1, -1, -1, $hParent)

    $LV = GUICtrlCreateListView('Номер записи|Дата Создания|Пользователь|Должность|Название|Модель|Номер|Владелец|Адрес владельца|Коментарий', 5, 5, 890, 250, Default, BitOR($LVS_EX_CHECKBOXES, $LVS_EX_GRIDLINES))

    For $i = 1 To UBound($Array) - 1
        $LV_Item = _GUICtrlListView_AddItem($LV, $Array[$i][0], $i - 1)
        _GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][1] & ' ' & _Month($Array[$i][2]) & ' ' & $Array[$i][3], 1)
        _GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][4], 2)
        _GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][5], 3)
        _GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][6], 4)
        _GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][7], 5)
        _GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][8], 6)
        _GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][9], 7)
        _GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][10], 8)
        _GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][11], 9)

    Next

    $But_OK = GUICtrlCreateButton('Выбор', 20, 260, 150, 35)
    GUISetState(@SW_DISABLE, $hParent)
    GUISetState(@SW_SHOW, $hSettings_GUI)

    While 1
        $nMsg = GUIGetMsg()

        Switch $nMsg
            Case $GUI_EVENT_CLOSE
                ExitLoop
            Case $But_OK
                $Index = -1
                For $i = 0 To _GUICtrlListView_GetItemCount($LV)
                    If _GUICtrlListView_GetItemChecked($LV, $i) Then
                        $Index = $i
                        ExitLoop
                    EndIf
                Next

                If $Index = -1 Then
                    MsgBox(48, 'Внимание !', 'Не выбрано ни одного пункта !', 3)
                Else
                    GUICtrlSetData($Input1, $Array[$Index + 1][0])
                    GUICtrlSetData($Label3, $Array[$Index + 1][1] & ' ' & _Month($Array[$Index + 1][2]) & ' ' & $Array[$Index + 1][3])
                    GUICtrlSetData($Input2, $Array[$Index + 1][4])
                    GUICtrlSetData($Input3, $Array[$Index + 1][5])
                    GUICtrlSetData($Input4, $Array[$Index + 1][6])
                    GUICtrlSetData($Input5, $Array[$Index + 1][7])
                    GUICtrlSetData($Input6, $Array[$Index + 1][8])
                    GUICtrlSetData($Input7, $Array[$Index + 1][9])
                    GUICtrlSetData($Input8, $Array[$Index + 1][10])
                    GUICtrlSetData($Input9, $Array[$Index + 1][11])

                    ExitLoop

                EndIf

        EndSwitch
    WEnd

    Opt("GUIOnEventMode", $iGOEM_Opt)
    GUISetState(@SW_ENABLE, $hParent)
    GUIDelete($hSettings_GUI)

EndFunc   ;==>_Select

Func _NewRecord()

    Local $aResult, $iRows, $iColumns

    $iRval = _SQLite_GetTable2d($dbn, "SELECT ARG_Nomer_Zapisi FROM TABLE_DATA;", $aResult, $iRows, $iColumns) ; возвращает двумерный массив в $aResult
    If $iRval = $SQLITE_OK Then
        Local $NewNumber = _ArrayMax($aResult, 1) + 1
        GUICtrlSetData($Input1, $NewNumber)
        ;_ArrayDisplay($aResult)
    Else
        MsgBox(16, "Ошибка SQLite: " & $iRval, _SQLite_ErrMsg())
    EndIf

    Local $NewData = @MDAY & ' ' & _Month(@MON) & ' ' & @YEAR
    GUICtrlSetData($Label3, $NewData)
	GUICtrlSetData($Input2, '')
	GUICtrlSetData($Input3, '')
	GUICtrlSetData($Input4, '')
	GUICtrlSetData($Input5, '')
	GUICtrlSetData($Input6, '')
	GUICtrlSetData($Input7, '')
	GUICtrlSetData($Input8, '')
	GUICtrlSetData($Input9, '')

EndFunc   ;==>_NewRecord

Func _Month($Number)
    Switch $Number
        Case 1
            Return 'Января'
        Case 2
            Return 'Февраля'
        Case 3
            Return 'Марта'
        Case 4
            Return 'Апреля'
        Case 5
            Return 'Мая'
        Case 6
            Return 'Июня'
        Case 7
            Return 'Июля'
        Case 8
            Return 'Августа'
        Case 9
            Return 'Сентября'
        Case 10
            Return 'Октября'
        Case 11
            Return 'Ноября'
        Case 12
            Return 'Декабря'
    EndSwitch

EndFunc   ;==>_Month

Func _Exit() ; Выход
    _SQLite_Close()
    _SQLite_Shutdown()
    Exit
EndFunc   ;==>_Exit
 
Автор
G

Genics

Новичок
Сообщения
39
Репутация
0
Я так понимаю - изменять запись в базе нельзя, можно только добавлять новую запись?
Да совершенно верно, изменять/удалять программа не должна.

Что должно отображаться в полях при первом запуске? Сейчас всё пусто,
При запуске программы в полях должна отображаться последняя сделанная запись в БД. Т. е. строка под самым большим значением «номер записи» которая есть в БД.

Цитировать: Еще надо бы, чтобы поиск не учитывал регистр букв
Я не знал что существует такая проблема. Жаль, это сильно усложнит пользование программой, когда количество записей (строк), перевалит за очень большое значение.
Если эту проблему сложно решить тогда оставляем так.

Изменил, отказался от файла Users.ini - данные берутся из базы.
Это правильно, так будет лучше ;D. Если в базе есть все необходимые данные, то не нужно создавать лишних файлов.

попытка записи в базу со значением номера записи которое существует - приведёт к ошибке.
Да все работает. :ok:

С последним пунктом я что-то не понял:
С обработкой кнопки «Новая запись» пока ничего не делал, пробовал разные варианты - всё срабатывало корректно.
Хотя в начале было написано:
если нажать "Новая запись " в поле с номером записи - максимальный номер в базе +1
В общем, у меня все равно при нажатии на кнопку "Новая запись " в поле «номер записи» появляется 1. Да она должна появляться если база пуста. Но если на данный момент в базе 4-е записи, то нажатие на кнопку "Новая запись " (не важно на какой записи я нахожусь на 1-й или 3-й), в поле «номер записи» должно выводить 5.
Это сложно программировать, или у нас просто какое-то недопонимание?
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
247
Но если на данный момент в базе 4-е записи, то нажатие на кнопку "Новая запись " (не важно на какой записи я нахожусь на 1-й или 3-й), в поле «номер записи» должно выводить 5.
Именно так эта кнопка и работает на данный момент - ищет максимальный номер записи в базе и прибавляет 1
При запуске программы в полях должна отображаться последняя сделанная запись в БД
Изменил (в предыдущем посте заменил)
 
Автор
G

Genics

Новичок
Сообщения
39
Репутация
0
По непонятной мне причине у меня не срабатывает правильно функция _ArrayMax. :shok:

Поэтому строка 108:
Код:
$MaxNumber = _ArrayMax($aResult, 1)

присваивает переменной «пустое» значение (или нулевое).

И строка 316:
Код:
Local $NewNumber = _ArrayMax($aResult, 1) + 1

присваивает переменной («пустое»+1).
Отсюда и 1 появляется при нажатии на кнопку «Новая запись».

У меня что файл #include <Array.au3> неправильный?
Если у тебя работает можешь вложить свой Array.au3, хочу с твоим попробовать.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Код:
Возвращаемое значение

Успех: Возвращает наибольшее значение в массиве 
Ошибка: Возвращает "" (пустую строку), устанавливает @error (смотрите описание кодов ошибок функции _ArrayMaxIndex() )
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
247
После строки с поиском макс. значения поставьте
Код:
If @Error Then MsgBox(48,'Ошибка !','Ошибка поиска максимального значения в массиве № '&@error)
, можно еще посмотреть на сам массив
Код:
_ArrayDisplay($aResult)

Прикрепил, сам Array.au3, но вряд-ли проблема в нём...
 

Вложения

  • Array.au3
    98.3 КБ · Просмотры: 6
Автор
G

Genics

Новичок
Сообщения
39
Репутация
0
Привет ra4o!

После строки с поиском макс. значения поставьте Код: AutoIt [Выделить]
If @Error Then MsgBox(48,'Ошибка !','Ошибка поиска максимального значения в массиве № '&@error)
На эту строку совсем никак не реагирует. Я ее поставил сразу после строки
Код:
;Поиск максимального номера в базе и заполнение всех полей даннымим при первом запуске
$iRval = _SQLite_GetTable2d($dbn, "SELECT ARG_Nomer_Zapisi FROM TABLE_DATA ", $aResult, $iRows, $iColumns)


Не знаю правильно или нет :-[

, можно еще посмотреть на сам массив Код: AutoIt [Выделить]
_ArrayDisplay($aResult)

Здесь вроде все правильно. По идее должно было работать. (файл с картинкой вложен)

Хотел поинтересоваться на какой версии AutoIt ты делал эту программу?

У тебя более свежий файл Array.au3. Я скопировал твой файл в папку Include и запустил программу. В твоем файле оказались тоже разные Include файлы которые он у меня не нашел.
Программа просто открывалась и закрывалась

На работе я использую AutoIt v3.3.10.2, на все более старшие ругается Касперский.
Дома попробую программу на других версиях AutoIt.
 

Вложения

  • ArrayDisplay.png
    ArrayDisplay.png
    14 КБ · Просмотры: 7

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
247
У меня версия AutoIt 3.3.14.0. Массив у Вас правильно создаётся - в нём выбраны номера записей , из которых функция " _ArrayMax" и выбирает максимальный номер. Попробуйте заменить вот эту строку (дописать ещё один параметр)
Код:
$MaxNumber = _ArrayMax($aResult, 1,1)

Изменил, теперь без "_ArrayMax", написал свою функцию поиска максимального значения
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <File.au3>
#include <SQLite.au3>
#include <Array.au3>
#include <GuiComboBox.au3>
#include <GuiListView.au3>

If Not FileExists(@ScriptDir & '/DB_DATA.db') Then
	MsgBox(48, 'Ошибка !', 'Не найден файл базы данных !' & @CRLF & 'DB_DATA.db', 3)
	Exit
EndIf

Global $sPathFile = @ScriptDir & '/File_Nomer_zapisi.dat'
If Not FileExists($sPathFile) Then
	MsgBox(48, 'Ошибка !', 'Не найден файл базы данных !' & $sPathFile, 3)
	Exit
EndIf


#Region ### START Koda GUI section ### Form=d:\7 ДЕЛА\РАБ Техзадание на БД ЭУ3\Форма БД Заказчиков\form1.kxf

$Form1_1 = GUICreate("Form1", 618, 478)
$Button1 = GUICtrlCreateButton("Новая запись", 8, 8, 97, 49)
$Label1 = GUICtrlCreateLabel("Номер записи", 112, 24, 117, 20, $SS_CENTER)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xFFFFE1)

$Button2 = GUICtrlCreateButton("/\", 344, 8, 25, 25)
$Button3 = GUICtrlCreateButton("\/", 344, 32, 25, 25)
$Label2 = GUICtrlCreateLabel("Дата создания", 384, 24, 114, 20, $SS_CENTER)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xA6CAF0)
$Label3 = GUICtrlCreateLabel("", 504, 26, 99, 17, $SS_CENTER)
GUICtrlSetBkColor(-1, 0xFFFFFF)
$Label4 = GUICtrlCreateLabel("Пользователь", 8, 80, 111, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xA6CAF0)
$Label5 = GUICtrlCreateLabel(" Должность", 328, 80, 88, 20, $SS_CENTER)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xA6CAF0)
$Label6 = GUICtrlCreateLabel("Название", 8, 128, 102, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xFFFFE1)
$Label7 = GUICtrlCreateLabel("Модель", 8, 168, 100, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xFFFFE1)
$Label8 = GUICtrlCreateLabel("Номер", 8, 208, 100, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xFFFFE1)
$Label9 = GUICtrlCreateLabel(" Владелец", 8, 248, 97, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xFFFFE1)
$Label10 = GUICtrlCreateLabel("Адрес владельца", 8, 288, 605, 20, $SS_CENTER)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xA6CAF0)
$Label11 = GUICtrlCreateLabel("Коментарий", 8, 352, 606, 20, $SS_CENTER)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xA6CAF0)

$Input2 = GUICtrlCreateCombo("", 128, 80, 165, 21) ;Пользователь


$Input3 = GUICtrlCreateCombo("", 424, 80, 165, 21) ;должность


$Input1 = GUICtrlCreateInput("", 232, 24, 81, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER)) ;Номер записи
$Input4 = GUICtrlCreateInput("", 112, 128, 473, 21) ;название
$Input5 = GUICtrlCreateInput("", 112, 168, 473, 21) ;модель
$Input6 = GUICtrlCreateInput("", 112, 208, 473, 21) ;Номер
$Input7 = GUICtrlCreateInput("", 112, 248, 473, 21) ;Владелец
$Input8 = GUICtrlCreateInput("", 8, 312, 603, 21) ;Адрес владельца
$Input9 = GUICtrlCreateInput("", 8, 376, 603, 21) ;Коментарий
$Button4 = GUICtrlCreateButton("П", 312, 22, 25, 25)
$Button5 = GUICtrlCreateButton("П", 584, 126, 25, 25)
$Button6 = GUICtrlCreateButton("П", 584, 166, 25, 25)
$Button9 = GUICtrlCreateButton("П", 584, 206, 25, 25)
$Button10 = GUICtrlCreateButton("П", 584, 246, 25, 25)
$Button7 = GUICtrlCreateButton("Сохранить", 256, 416, 105, 41)
GUISetState(@SW_SHOW)

#EndRegion ### END Koda GUI section ###

_SQLite_Startup() ; Загружаем "SQLite3.dll"
If @error > 0 Then Exit MsgBox(16, 'SQLite Ошибка', 'SQLite.dll Не может быть загружен!')
Global $dbn = _SQLite_Open('DB_DATA.db') ; Открываем БД

Local $aResult, $iRows, $iColumns
;Поиск из базы всех Пользователей
$iRval = _SQLite_GetTable2d($dbn, "SELECT ARG_User FROM TABLE_DATA ", $aResult, $iRows, $iColumns) ; возвращает двумерный массив в $aResult
$aUser = _ArrayUnique($aResult)
For $i = 2 To UBound($aUser) - 1
	_GUICtrlComboBox_AddString($Input2, $aUser[$i])
Next

;Поиск из базы всех должностей
$iRval = _SQLite_GetTable2d($dbn, "SELECT ARG_Doljnost FROM TABLE_DATA ", $aResult, $iRows, $iColumns) ; возвращает двумерный массив в $aResult
$aPost = _ArrayUnique($aResult)
For $i = 2 To UBound($aPost) - 1
	_GUICtrlComboBox_AddString($Input3, $aPost[$i])
Next

;Поиск максимального номера в базе и заполнение всех полей даннымим при первом запуске
$iRval = _SQLite_GetTable2d($dbn, "SELECT ARG_Nomer_Zapisi FROM TABLE_DATA ", $aResult, $iRows, $iColumns)
$MaxNumber = _ArrMax($aResult, 1,0)
$Zapros = "SELECT * FROM TABLE_DATA WHERE ARG_Nomer_Zapisi='" & $MaxNumber & "'"
$Text = 'Ошибка чтения из базы номера ' & $MaxNumber & ' !'
_Search($Zapros, $Text)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $Button10 ; Поиск по владельцу
			$Zapros = "SELECT * FROM TABLE_DATA WHERE ARG_Vladelec='" & GUICtrlRead($Input7) & "'"
			$Text = 'Владелец ' & GUICtrlRead($Input7) & ' не найден !'
			_Search($Zapros, $Text)

		Case $Button9 ; Поиск по номеру
			$Zapros = "SELECT * FROM TABLE_DATA WHERE ARG_Nomer='" & GUICtrlRead($Input6) & "'"
			$Text = 'Номер ' & GUICtrlRead($Input6) & ' не найден !'
			_Search($Zapros, $Text)

		Case $Button6 ; Поиск по Модели

			$Zapros = "SELECT * FROM TABLE_DATA WHERE ARG_Model='" & GUICtrlRead($Input5) & "'"
			$Text = 'Модель ' & GUICtrlRead($Input5) & ' не найдена !'
			_Search($Zapros, $Text)

		Case $Button5 ; Поиск по Названию

			$Zapros = "SELECT * FROM TABLE_DATA WHERE  ARG_Naimenovanie ='" & GUICtrlRead($Input4) & "'"
			$Text = 'Название ' & GUICtrlRead($Input4) & ' не найдено !'
			_Search($Zapros, $Text)

		Case $Button4 ; Поиск по номеру записи

			$Zapros = "SELECT * FROM TABLE_DATA WHERE ARG_Nomer_Zapisi='" & GUICtrlRead($Input1) & "'"
			$Text = 'Номер ' & GUICtrlRead($Input1) & ' не найден!'
			_Search($Zapros, $Text)

		Case $Button2 ; Номер плюс
			GUICtrlSetData($Input1, GUICtrlRead($Input1) + 1)

		Case $Button3 ; Номер минус
			If GUICtrlRead($Input1) - 1 > 0 Then GUICtrlSetData($Input1, GUICtrlRead($Input1) - 1)

		Case $Button1 ;Новая запись

			_NewRecord()
		Case $Button7 ; Сохранить
			_Save()

		Case $GUI_EVENT_CLOSE
			_Exit()


	EndSwitch
WEnd

Func _Save()
	Local $aResult, $iRows, $iColumns

	$iRval = _SQLite_GetTable2d($dbn, "SELECT * FROM TABLE_DATA WHERE ARG_Nomer_Zapisi='" & GUICtrlRead($Input1) & "'", $aResult, $iRows, $iColumns) ; возвращает двумерный массив в $aResult
	If $iRval = $SQLITE_OK Then
		If UBound($aResult) > 1 Then ; если номер уже есть в базе
			MsgBox(48, 'Ошибка !', 'Запись с номером ' & GUICtrlRead($Input1) & ' уже существует в базе' & @CRLF & 'и не может быть перезаписана !')

		Else ;Сохранение записи в базу, если номер записи новый
			If Not _SQLite_Exec($dbn, "INSERT INTO TABLE_DATA VALUES ('" & GUICtrlRead($Input1) & "','" & @MDAY & "','" & @MON & "','" & @YEAR & "','" & GUICtrlRead($Input2) & "','" & GUICtrlRead($Input3) & "','" & GUICtrlRead($Input4) & "','" & GUICtrlRead($Input5) & "','" & GUICtrlRead($Input6) & "','" & GUICtrlRead($Input7) & "','" & GUICtrlRead($Input8) & "','" & GUICtrlRead($Input9) & "');") = $SQLITE_OK Then
				MsgBox(16, 'SQLite Ошибка', _SQLite_ErrMsg())
				_Exit()
			EndIf
			;Запись нового пользователя в $Input2, если его там нет
			If _ArraySearch($aUser, GUICtrlRead($Input2)) < 0 Then
				_ArrayAdd($aUser, GUICtrlRead($Input2))
				_GUICtrlComboBox_AddString($Input2, GUICtrlRead($Input2))
			EndIf

			;Запись новой должности в $Input3, если её там нет
			If _ArraySearch($aPost, GUICtrlRead($Input3)) < 0 Then
				_ArrayAdd($aUser, GUICtrlRead($Input3))
				_GUICtrlComboBox_AddString($Input3, GUICtrlRead($Input3))
			EndIf

		EndIf

	Else
		MsgBox(16, "Ошибка SQLite: " & $iRval, _SQLite_ErrMsg())
	EndIf
EndFunc   ;==>_Save


Func _Search($Zapros, $Text)

	Local $aResult, $iRows, $iColumns

	$iRval = _SQLite_GetTable2d($dbn, $Zapros, $aResult, $iRows, $iColumns) ; возвращает двумерный массив в $aResult
	If $iRval = $SQLITE_OK Then
		If UBound($aResult) = 2 Then
			;_ArrayDisplay($aResult)
			GUICtrlSetData($Input1, $aResult[1][0])
			GUICtrlSetData($Label3, $aResult[1][1] & ' ' & _Month($aResult[1][2]) & ' ' & $aResult[1][3])
			GUICtrlSetData($Input2, $aResult[1][4])
			GUICtrlSetData($Input3, $aResult[1][5])
			GUICtrlSetData($Input4, $aResult[1][6])
			GUICtrlSetData($Input5, $aResult[1][7])
			GUICtrlSetData($Input6, $aResult[1][8])
			GUICtrlSetData($Input7, $aResult[1][9])
			GUICtrlSetData($Input8, $aResult[1][10])
			GUICtrlSetData($Input9, $aResult[1][11])
		ElseIf UBound($aResult) > 2 Then
			_Select($aResult, $Form1_1)

		Else
			MsgBox(16, "Ошибка поиска", $Text)
		EndIf
		;Запись результата в файл File_Nomer_zapisi.dat
		$hFile = FileOpen($sPathFile, 2)
		FileWrite($hFile, StringFormat("A000 %d\n", GUICtrlRead($Input1)))
		FileClose($hFile)


	Else
		MsgBox(16, "Ошибка SQLite: " & $iRval, _SQLite_ErrMsg())
	EndIf

EndFunc   ;==>_Search


Func _Select($Array, $hParent = 0)

	Local $hSettings, $iGOEM_Opt

	;Предотвращение проблем в случае если главный GUI использует режим событий
	$iGOEM_Opt = Opt("GUIOnEventMode", 0)

	$hSettings_GUI = GUICreate('Выбор позиции', 900, 300, -1, -1, -1, -1, $hParent)

	$LV = GUICtrlCreateListView('Номер записи|Дата Создания|Пользователь|Должность|Название|Модель|Номер|Владелец|Адрес владельца|Коментарий', 5, 5, 890, 250, Default, BitOR($LVS_EX_CHECKBOXES, $LVS_EX_GRIDLINES))

	For $i = 1 To UBound($Array) - 1
		$LV_Item = _GUICtrlListView_AddItem($LV, $Array[$i][0], $i - 1)
		_GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][1] & ' ' & _Month($Array[$i][2]) & ' ' & $Array[$i][3], 1)
		_GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][4], 2)
		_GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][5], 3)
		_GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][6], 4)
		_GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][7], 5)
		_GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][8], 6)
		_GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][9], 7)
		_GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][10], 8)
		_GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][11], 9)

	Next

	$But_OK = GUICtrlCreateButton('Выбор', 20, 260, 150, 35)
	GUISetState(@SW_DISABLE, $hParent)
	GUISetState(@SW_SHOW, $hSettings_GUI)

	While 1
		$nMsg = GUIGetMsg()

		Switch $nMsg
			Case $GUI_EVENT_CLOSE
				ExitLoop
			Case $But_OK
				$Index = -1
				For $i = 0 To _GUICtrlListView_GetItemCount($LV)
					If _GUICtrlListView_GetItemChecked($LV, $i) Then
						$Index = $i
						ExitLoop
					EndIf
				Next

				If $Index = -1 Then
					MsgBox(48, 'Внимание !', 'Не выбрано ни одного пункта !', 3)
				Else
					GUICtrlSetData($Input1, $Array[$Index + 1][0])
					GUICtrlSetData($Label3, $Array[$Index + 1][1] & ' ' & _Month($Array[$Index + 1][2]) & ' ' & $Array[$Index + 1][3])
					GUICtrlSetData($Input2, $Array[$Index + 1][4])
					GUICtrlSetData($Input3, $Array[$Index + 1][5])
					GUICtrlSetData($Input4, $Array[$Index + 1][6])
					GUICtrlSetData($Input5, $Array[$Index + 1][7])
					GUICtrlSetData($Input6, $Array[$Index + 1][8])
					GUICtrlSetData($Input7, $Array[$Index + 1][9])
					GUICtrlSetData($Input8, $Array[$Index + 1][10])
					GUICtrlSetData($Input9, $Array[$Index + 1][11])

					ExitLoop

				EndIf

		EndSwitch
	WEnd

	Opt("GUIOnEventMode", $iGOEM_Opt)
	GUISetState(@SW_ENABLE, $hParent)
	GUIDelete($hSettings_GUI)

EndFunc   ;==>_Select

Func _NewRecord()

	Local $aResult, $iRows, $iColumns

	$iRval = _SQLite_GetTable2d($dbn, "SELECT ARG_Nomer_Zapisi FROM TABLE_DATA;", $aResult, $iRows, $iColumns) ; возвращает двумерный массив в $aResult
	If $iRval = $SQLITE_OK Then
		Local $NewNumber = _ArrayMax($aResult, 1) + 1
		GUICtrlSetData($Input1, $NewNumber)
		;_ArrayDisplay($aResult)
	Else
		MsgBox(16, "Ошибка SQLite: " & $iRval, _SQLite_ErrMsg())
	EndIf

	Local $NewData = @MDAY & ' ' & _Month(@MON) & ' ' & @YEAR
	GUICtrlSetData($Label3, $NewData)
	GUICtrlSetData($Input2, '')
	GUICtrlSetData($Input3, '')
	GUICtrlSetData($Input4, '')
	GUICtrlSetData($Input5, '')
	GUICtrlSetData($Input6, '')
	GUICtrlSetData($Input7, '')
	GUICtrlSetData($Input8, '')
	GUICtrlSetData($Input9, '')

EndFunc   ;==>_NewRecord

Func _Month($Number)
	Switch $Number
		Case 1
			Return 'Января'
		Case 2
			Return 'Февраля'
		Case 3
			Return 'Марта'
		Case 4
			Return 'Апреля'
		Case 5
			Return 'Мая'
		Case 6
			Return 'Июня'
		Case 7
			Return 'Июля'
		Case 8
			Return 'Августа'
		Case 9
			Return 'Сентября'
		Case 10
			Return 'Октября'
		Case 11
			Return 'Ноября'
		Case 12
			Return 'Декабря'
	EndSwitch

EndFunc   ;==>_Month

Func _Exit() ; Выход
	_SQLite_Close()
	_SQLite_Shutdown()
	Exit
EndFunc   ;==>_Exit

Func _ArrMax($aArray, $Start,$iRow)
	Local $iMax
	If IsArray($aArray) Then
		If UBound($aArray) = 1 Then Return 0
		$iMax = $aArray[$Start][$iRow]
		For $i = $Start To UBound($aArray) - 1
			If $aArray[$i][$iRow] > $iMax Then $iMax = $aArray[$i][$iRow]
		Next
		Return $iMax
	Else
		MsgBox(48,'Ошибка !','Ошибка поиска макс.значения !')
		SetError(1)
		Return 0
	EndIf

	EndFunc   ;==>_ArrMax
 
Автор
G

Genics

Новичок
Сообщения
39
Репутация
0
Отлично, теперь заработало!
При старте выдает последнюю запись . Только ты забыл про кнопку «новая запись», я сам подправил в функции _NewRecord() изменил строку 310:
Код:
Local $NewNumber = _ArrMax($aResult, 1, 0) + 1 ;БЫЛО:Local $NewNumber = _ArrayMax($aResult, 1) + 1


Теперь кнопка «новая запись» срабатывает почти правильно:
выдает нужный номер записи, устанавливает текущую дату.
Но есть проблема! Удаляет с полей инфу, этого она делать не должна. Мне нужна возможность сохранить в БД то, что отображалось в полях при нажатии на кнопку «новая запись». Естественно подкорректировав ее немного. Это экономит время ввода данных.

И куда-то пропадают фамилии и должности в Combobox-ах. Хочу выбрать а там пусто.

Я пробовал запускать программу на AutoIt 3.3.14.0. Там возникла другая ошибка. (файл вложен)
Ну да ладно, в AutoIt v3.3.10.2 такой ошибки нет. (Хотя может просто до нее не доходит… :scratch:)

Еще я сделал небольшую доработку. Скопировал код выбора события при нажатии на кнопку $Button4 и вставил его в кнопки $Button2 и $Button3.
Код:
Case $Button4 ; Поиск по номеру записи

            $Zapros = "SELECT * FROM TABLE_DATA WHERE ARG_Nomer_Zapisi='" & GUICtrlRead($Input1) & "'"
            $Text = 'Номер ' & GUICtrlRead($Input1) & ' не найден!'
            _Search($Zapros, $Text)

Case $Button2 ; Номер плюс
            GUICtrlSetData($Input1, GUICtrlRead($Input1) + 1)

			$Zapros = "SELECT * FROM TABLE_DATA WHERE ARG_Nomer_Zapisi='" & GUICtrlRead($Input1) & "'"
            $Text = 'Номер ' & GUICtrlRead($Input1) & ' не найден!'
            _Search($Zapros, $Text)

Case $Button3 ; Номер минус
            If GUICtrlRead($Input1) - 1 > 0 Then GUICtrlSetData($Input1, GUICtrlRead($Input1) - 1)

			$Zapros = "SELECT * FROM TABLE_DATA WHERE ARG_Nomer_Zapisi='" & GUICtrlRead($Input1) & "'"
            $Text = 'Номер ' & GUICtrlRead($Input1) & ' не найден!'
            _Search($Zapros, $Text)


Теперь не надо нажимать после стрелок на «П». Просто листаешь записи и все, очень удобно.
 

Вложения

  • Ошибка_1 на AutoIt14.png
    Ошибка_1 на AutoIt14.png
    4.5 КБ · Просмотры: 13

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
247
Что-то я отвлёкся от Вашей темы :-[
Но есть проблема! Удаляет с полей инфу, этого она делать не должна
Подкорректируйте функцию "_NewRecord()", а именно уберите или закоментируйте все строки очистки полей
Код:
Func _NewRecord()

    Local $aResult, $iRows, $iColumns

    $iRval = _SQLite_GetTable2d($dbn, "SELECT ARG_Nomer_Zapisi FROM TABLE_DATA;", $aResult, $iRows, $iColumns) ; возвращает двумерный массив в $aResult
    If $iRval = $SQLITE_OK Then
        Local $NewNumber = _ArrayMax($aResult, 1) + 1
        GUICtrlSetData($Input1, $NewNumber)
        ;_ArrayDisplay($aResult)
    Else
        MsgBox(16, "Ошибка SQLite: " & $iRval, _SQLite_ErrMsg())
    EndIf

    Local $NewData = @MDAY & ' ' & _Month(@MON) & ' ' & @YEAR
    GUICtrlSetData($Label3, $NewData)


EndFunc   ;==>_NewRecord

останется вся информация до нажатия кнопки "Новая запись"
 
Автор
G

Genics

Новичок
Сообщения
39
Репутация
0
Последнее тестирование показало что все работает так как надо. Думаю, что работа над этой программой завершена. Жаль конечно что поиск не такой удобный как я хотел, но ничего и так сойдет. Благодарю тебя ra4o за проделанную работу. Спасибо большое.

Для всех желающих выкладываю окончательный код который я использую.
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <File.au3>
#include <SQLite.au3>
#include <Array.au3>
#include <GuiComboBox.au3>
#include <GuiListView.au3>

If Not FileExists(@ScriptDir & '/DB_DATA.db') Then
    MsgBox(48, 'Ошибка !', 'Не найден файл базы данных !' & @CRLF & 'DB_DATA.db', 3)
    Exit
EndIf

Global $sPathFile = @ScriptDir & '/File_Nomer_zapisi.dat'
If Not FileExists($sPathFile) Then
    MsgBox(48, 'Ошибка !', 'Не найден файл базы данных !' & $sPathFile, 3)
    Exit
EndIf

#Region ### START Koda GUI section ### Form=d:\7 ДЕЛА\РАБ Техзадание на БД ЭУ3\Форма БД Заказчиков\form1.kxf

$Form1_1 = GUICreate("Form1", 618, 478)
$Button1 = GUICtrlCreateButton("Новая запись", 8, 8, 97, 49)
$Label1 = GUICtrlCreateLabel("Номер записи", 112, 24, 117, 20, $SS_CENTER)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xFFFFE1)

$Button2 = GUICtrlCreateButton("/\", 344, 8, 25, 25)
$Button3 = GUICtrlCreateButton("\/", 344, 32, 25, 25)
$Label2 = GUICtrlCreateLabel("Дата создания", 384, 24, 114, 20, $SS_CENTER)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xA6CAF0)
$Label3 = GUICtrlCreateLabel("", 504, 26, 99, 17, $SS_CENTER)
GUICtrlSetBkColor(-1, 0xFFFFFF)
$Label4 = GUICtrlCreateLabel("Пользователь", 8, 80, 111, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xA6CAF0)
$Label5 = GUICtrlCreateLabel(" Должность", 328, 80, 88, 20, $SS_CENTER)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xA6CAF0)
$Label6 = GUICtrlCreateLabel("Название", 8, 128, 102, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xFFFFE1)
$Label7 = GUICtrlCreateLabel("Модель", 8, 168, 100, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xFFFFE1)
$Label8 = GUICtrlCreateLabel("Номер", 8, 208, 100, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xFFFFE1)
$Label9 = GUICtrlCreateLabel(" Владелец", 8, 248, 97, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xFFFFE1)
$Label10 = GUICtrlCreateLabel("Адрес владельца", 8, 288, 605, 20, $SS_CENTER)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xA6CAF0)
$Label11 = GUICtrlCreateLabel("Коментарий", 8, 352, 606, 20, $SS_CENTER)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, 0xA6CAF0)

$Input2 = GUICtrlCreateCombo("", 128, 80, 165, 21) ;Пользователь
$Input3 = GUICtrlCreateCombo("", 424, 80, 165, 21) ;должность
$Input1 = GUICtrlCreateInput("", 232, 24, 81, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER)) ;Номер записи
$Input4 = GUICtrlCreateInput("", 112, 128, 473, 21) ;название
$Input5 = GUICtrlCreateInput("", 112, 168, 473, 21) ;модель
$Input6 = GUICtrlCreateInput("", 112, 208, 473, 21) ;Номер
$Input7 = GUICtrlCreateInput("", 112, 248, 473, 21) ;Владелец
$Input8 = GUICtrlCreateInput("", 8, 312, 603, 21) ;Адрес владельца
$Input9 = GUICtrlCreateInput("", 8, 376, 603, 21) ;Коментарий
$Button4 = GUICtrlCreateButton("П", 312, 22, 25, 25)
$Button5 = GUICtrlCreateButton("П", 584, 126, 25, 25)
$Button6 = GUICtrlCreateButton("П", 584, 166, 25, 25)
$Button9 = GUICtrlCreateButton("П", 584, 206, 25, 25)
$Button10 = GUICtrlCreateButton("П", 584, 246, 25, 25)
$Button7 = GUICtrlCreateButton("Сохранить", 256, 416, 105, 41)
GUISetState(@SW_SHOW)

#EndRegion ### END Koda GUI section ###

_SQLite_Startup() ; Загружаем "SQLite3.dll"
If @error > 0 Then Exit MsgBox(16, 'SQLite Ошибка', 'SQLite.dll Не может быть загружен!')
Global $dbn = _SQLite_Open('DB_DATA.db') ; Открываем БД

Local $aResult, $iRows, $iColumns
;Поиск из базы всех Пользователей
$iRval = _SQLite_GetTable2d($dbn, "SELECT ARG_User FROM TABLE_DATA ", $aResult, $iRows, $iColumns) ; возвращает двумерный массив в $aResult
$aUser = _ArrayUnique($aResult)
For $i = 2 To UBound($aUser) - 1
    _GUICtrlComboBox_AddString($Input2, $aUser[$i])
Next

;Поиск из базы всех должностей
$iRval = _SQLite_GetTable2d($dbn, "SELECT ARG_Doljnost FROM TABLE_DATA ", $aResult, $iRows, $iColumns) ; возвращает двумерный массив в $aResult
$aPost = _ArrayUnique($aResult)
For $i = 2 To UBound($aPost) - 1
    _GUICtrlComboBox_AddString($Input3, $aPost[$i])
Next

;Поиск максимального номера в базе и заполнение всех полей даннымим при первом запуске
$iRval = _SQLite_GetTable2d($dbn, "SELECT ARG_Nomer_Zapisi FROM TABLE_DATA ", $aResult, $iRows, $iColumns)
$MaxNumber = _ArrMax($aResult, 1,0)
$Zapros = "SELECT * FROM TABLE_DATA WHERE ARG_Nomer_Zapisi='" & $MaxNumber & "'"
$Text = 'Ошибка чтения из базы номера ' & $MaxNumber & ' !'
_Search($Zapros, $Text)

While 1

    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $Button10 ; Поиск по владельцу
            $Zapros = "SELECT * FROM TABLE_DATA WHERE ARG_Vladelec='" & GUICtrlRead($Input7) & "'"
            $Text = 'Владелец ' & GUICtrlRead($Input7) & ' не найден !'
            _Search($Zapros, $Text)

        Case $Button9 ; Поиск по номеру
            $Zapros = "SELECT * FROM TABLE_DATA WHERE ARG_Nomer='" & GUICtrlRead($Input6) & "'"
            $Text = 'Номер ' & GUICtrlRead($Input6) & ' не найден !'
            _Search($Zapros, $Text)

        Case $Button6 ; Поиск по Модели

            $Zapros = "SELECT * FROM TABLE_DATA WHERE ARG_Model='" & GUICtrlRead($Input5) & "'"
            $Text = 'Модель ' & GUICtrlRead($Input5) & ' не найдена !'
            _Search($Zapros, $Text)

        Case $Button5 ; Поиск по Названию

            $Zapros = "SELECT * FROM TABLE_DATA WHERE  ARG_Naimenovanie ='" & GUICtrlRead($Input4) & "'"
            $Text = 'Название ' & GUICtrlRead($Input4) & ' не найдено !'
            _Search($Zapros, $Text)

        Case $Button4 ; Поиск по номеру записи

            $Zapros = "SELECT * FROM TABLE_DATA WHERE ARG_Nomer_Zapisi='" & GUICtrlRead($Input1) & "'"
            $Text = 'Номер ' & GUICtrlRead($Input1) & ' не найден!'
            _Search($Zapros, $Text)

        Case $Button2 ; Номер плюс
            GUICtrlSetData($Input1, GUICtrlRead($Input1) + 1)

			$Zapros = "SELECT * FROM TABLE_DATA WHERE ARG_Nomer_Zapisi='" & GUICtrlRead($Input1) & "'"
            $Text = 'Номер ' & GUICtrlRead($Input1) & ' не найден!'
            _Search($Zapros, $Text)

        Case $Button3 ; Номер минус
            If GUICtrlRead($Input1) - 1 > 0 Then GUICtrlSetData($Input1, GUICtrlRead($Input1) - 1)

			$Zapros = "SELECT * FROM TABLE_DATA WHERE ARG_Nomer_Zapisi='" & GUICtrlRead($Input1) & "'"
            $Text = 'Номер ' & GUICtrlRead($Input1) & ' не найден!'
            _Search($Zapros, $Text)

        Case $Button1 ;Новая запись

            _NewRecord()
        Case $Button7 ; Сохранить
            _Save()

        Case $GUI_EVENT_CLOSE
            _Exit()

    EndSwitch

WEnd

Func _Save()

    Local $aResult, $iRows, $iColumns

    $iRval = _SQLite_GetTable2d($dbn, "SELECT * FROM TABLE_DATA WHERE ARG_Nomer_Zapisi='" & GUICtrlRead($Input1) & "'", $aResult, $iRows, $iColumns) ; возвращает двумерный массив в $aResult
    If $iRval = $SQLITE_OK Then
        If UBound($aResult) > 1 Then ; если номер уже есть в базе
            MsgBox(48, 'Ошибка !', 'Запись с номером ' & GUICtrlRead($Input1) & ' уже существует в базе' & @CRLF & 'и не может быть перезаписана !')

        Else ;Сохранение записи в базу, если номер записи новый
            If Not _SQLite_Exec($dbn, "INSERT INTO TABLE_DATA VALUES ('" & GUICtrlRead($Input1) & "','" & @MDAY & "','" & @MON & "','" & @YEAR & "','" & GUICtrlRead($Input2) & "','" & GUICtrlRead($Input3) & "','" & GUICtrlRead($Input4) & "','" & GUICtrlRead($Input5) & "','" & GUICtrlRead($Input6) & "','" & GUICtrlRead($Input7) & "','" & GUICtrlRead($Input8) & "','" & GUICtrlRead($Input9) & "');") = $SQLITE_OK Then
                MsgBox(16, 'SQLite Ошибка', _SQLite_ErrMsg())
                _Exit()
            EndIf
            ;Запись нового пользователя в $Input2, если его там нет
            If _ArraySearch($aUser, GUICtrlRead($Input2)) < 0 Then
                _ArrayAdd($aUser, GUICtrlRead($Input2))
                _GUICtrlComboBox_AddString($Input2, GUICtrlRead($Input2))
            EndIf

            ;Запись новой должности в $Input3, если её там нет
            If _ArraySearch($aPost, GUICtrlRead($Input3)) < 0 Then
                _ArrayAdd($aUser, GUICtrlRead($Input3))
                _GUICtrlComboBox_AddString($Input3, GUICtrlRead($Input3))
            EndIf
        EndIf
    Else
        MsgBox(16, "Ошибка SQLite: " & $iRval, _SQLite_ErrMsg())
	 EndIf

EndFunc   ;==>_Save


Func _Search($Zapros, $Text)

    Local $aResult, $iRows, $iColumns

    $iRval = _SQLite_GetTable2d($dbn, $Zapros, $aResult, $iRows, $iColumns) ; возвращает двумерный массив в $aResult
    If $iRval = $SQLITE_OK Then
        If UBound($aResult) = 2 Then
            ;_ArrayDisplay($aResult)
            GUICtrlSetData($Input1, $aResult[1][0])
            GUICtrlSetData($Label3, $aResult[1][1] & ' ' & _Month($aResult[1][2]) & ' ' & $aResult[1][3])
            GUICtrlSetData($Input2, $aResult[1][4])
            GUICtrlSetData($Input3, $aResult[1][5])
            GUICtrlSetData($Input4, $aResult[1][6])
            GUICtrlSetData($Input5, $aResult[1][7])
            GUICtrlSetData($Input6, $aResult[1][8])
            GUICtrlSetData($Input7, $aResult[1][9])
            GUICtrlSetData($Input8, $aResult[1][10])
            GUICtrlSetData($Input9, $aResult[1][11])
        ElseIf UBound($aResult) > 2 Then
            _Select($aResult, $Form1_1)
        Else
            MsgBox(16, "Ошибка поиска", $Text)
        EndIf
        ;Запись результата в файл File_Nomer_zapisi.dat
        $hFile = FileOpen($sPathFile, 2)
        FileWrite($hFile, StringFormat("A000 %d\n", GUICtrlRead($Input1)))
        FileClose($hFile)
    Else
        MsgBox(16, "Ошибка SQLite: " & $iRval, _SQLite_ErrMsg())
    EndIf
EndFunc   ;==>_Search


Func _Select($Array, $hParent = 0)

    Local $hSettings, $iGOEM_Opt

    ;Предотвращение проблем в случае если главный GUI использует режим событий
    $iGOEM_Opt = Opt("GUIOnEventMode", 0)
    $hSettings_GUI = GUICreate('Выбор позиции', 900, 300, -1, -1, -1, -1, $hParent)
    $LV = GUICtrlCreateListView('Номер записи|Дата Создания|Пользователь|Должность|Название|Модель|Номер|Владелец|Адрес владельца|Коментарий', 5, 5, 890, 250, Default, BitOR($LVS_EX_CHECKBOXES, $LVS_EX_GRIDLINES))

    For $i = 1 To UBound($Array) - 1
        $LV_Item = _GUICtrlListView_AddItem($LV, $Array[$i][0], $i - 1)
        _GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][1] & ' ' & _Month($Array[$i][2]) & ' ' & $Array[$i][3], 1)
        _GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][4], 2)
        _GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][5], 3)
        _GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][6], 4)
        _GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][7], 5)
        _GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][8], 6)
        _GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][9], 7)
        _GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][10], 8)
        _GUICtrlListView_AddSubItem($LV, $i - 1, $Array[$i][11], 9)
    Next

    $But_OK = GUICtrlCreateButton('Выбор', 20, 260, 150, 35)
    GUISetState(@SW_DISABLE, $hParent)
    GUISetState(@SW_SHOW, $hSettings_GUI)

    While 1
        $nMsg = GUIGetMsg()

        Switch $nMsg
            Case $GUI_EVENT_CLOSE
                ExitLoop
            Case $But_OK
                $Index = -1
                For $i = 0 To _GUICtrlListView_GetItemCount($LV)
                    If _GUICtrlListView_GetItemChecked($LV, $i) Then
                        $Index = $i
                        ExitLoop
                    EndIf
                Next

                If $Index = -1 Then
                    MsgBox(48, 'Внимание !', 'Не выбрано ни одного пункта !', 3)
                Else
                    GUICtrlSetData($Input1, $Array[$Index + 1][0])
                    GUICtrlSetData($Label3, $Array[$Index + 1][1] & ' ' & _Month($Array[$Index + 1][2]) & ' ' & $Array[$Index + 1][3])
                    GUICtrlSetData($Input2, $Array[$Index + 1][4])
                    GUICtrlSetData($Input3, $Array[$Index + 1][5])
                    GUICtrlSetData($Input4, $Array[$Index + 1][6])
                    GUICtrlSetData($Input5, $Array[$Index + 1][7])
                    GUICtrlSetData($Input6, $Array[$Index + 1][8])
                    GUICtrlSetData($Input7, $Array[$Index + 1][9])
                    GUICtrlSetData($Input8, $Array[$Index + 1][10])
                    GUICtrlSetData($Input9, $Array[$Index + 1][11])
                    ExitLoop
                EndIf
        EndSwitch
    WEnd

    Opt("GUIOnEventMode", $iGOEM_Opt)
    GUISetState(@SW_ENABLE, $hParent)
    GUIDelete($hSettings_GUI)

EndFunc   ;==>_Select

Func _NewRecord()

    Local $aResult, $iRows, $iColumns

    $iRval = _SQLite_GetTable2d($dbn, "SELECT ARG_Nomer_Zapisi FROM TABLE_DATA;", $aResult, $iRows, $iColumns) ; возвращает двумерный массив в $aResult
    If $iRval = $SQLITE_OK Then
        Local $NewNumber = _ArrMax($aResult, 1, 0) + 1 ;БЫЛО:Local $NewNumber = _ArrayMax($aResult, 1) + 1
        GUICtrlSetData($Input1, $NewNumber)
        ;_ArrayDisplay($aResult)
    Else
        MsgBox(16, "Ошибка SQLite: " & $iRval, _SQLite_ErrMsg())
    EndIf

    Local $NewData = @MDAY & ' ' & _Month(@MON) & ' ' & @YEAR
    GUICtrlSetData($Label3, $NewData)
EndFunc   ;==>_NewRecord

Func _Month($Number)

    Switch $Number
        Case 1
            Return 'Января'
        Case 2
            Return 'Февраля'
        Case 3
            Return 'Марта'
        Case 4
            Return 'Апреля'
        Case 5
            Return 'Мая'
        Case 6
            Return 'Июня'
        Case 7
            Return 'Июля'
        Case 8
            Return 'Августа'
        Case 9
            Return 'Сентября'
        Case 10
            Return 'Октября'
        Case 11
            Return 'Ноября'
        Case 12
            Return 'Декабря'
    EndSwitch

EndFunc   ;==>_Month

Func _Exit() ; Выход
    _SQLite_Close()
    _SQLite_Shutdown()
    Exit
EndFunc   ;==>_Exit

Func _ArrMax($aArray, $Start,$iRow)

    Local $iMax
    If IsArray($aArray) Then
        If UBound($aArray) = 1 Then Return 0
        $iMax = $aArray[$Start][$iRow]
        For $i = $Start To UBound($aArray) - 1
            If $aArray[$i][$iRow] > $iMax Then $iMax = $aArray[$i][$iRow]
        Next
        Return $iMax
    Else
        MsgBox(48,'Ошибка !','Ошибка поиска макс.значения !')
        SetError(1)
        Return 0
    EndIf

EndFunc   ;==>_ArrMax
 
Верх