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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] vb.net правка access файла (http://forum.oszone.net/showthread.php?t=299011)

iccup.platoon@vk 27-04-2015 06:12 2501166

vb.net правка access файла
 
Здравствуйте, господа.
Есть файл Card.mdb, содержащий в себе таблицу NumberDisc. В этой таблице, помимо прочих, есть столбцы с названиями Discount и Amount. В ячейках этих столбцов записаны только числа (то есть ни букв, ни спец. знаков там нет). Такова задача:
Построчно анализируя информацию в ячейках этих двух, исходя из числа, находящегося в ячейке Amount, менять значение в ячейке Discount по принципу
Если Amount больше или равно 1 - Установить Discount = 5, но
Если Amount больше или равно 10 - Установить Discount = 10, но
Если Amount больше или равно 15 - Установить Discount = 15, и
Если Amount больше 20 - Установить Discount = 20
Такие вот дела...

Iska 27-04-2015 08:21 2501186

В чём вопрос-то?

iccup.platoon@vk 27-04-2015 15:09 2501371

В построении цикла с проверкой числа в ячейке амоунт и, на основании информации из нее, изменением числа в ячейке дискоунт. В контроле ацесса я, мягко говоря, еще не силен. В текстовых файлах это WriteLine, а здесь то что? Мне достаточно один раз увидеть - и я запомню =)

lxa85 27-04-2015 15:17 2501372

iccup.platoon@vk, здесь работа с множествами. Сложение пересечение и т.д.
Выбор записей из таблиц по условию - SELECT
Запись - INPUT
и как то так.
Если не затруднительно - приложите образец. С нуля пример дико лень писать.

iccup.platoon@vk 27-04-2015 15:35 2501385

Вложений: 1
Пример таблицы? Прикреплю. Пример кода? Да я даже с чего начать не знаю =( Вот код того, что постиг:
Большой код

Код:

Imports System.Data.OleDb
Public Class Form1
    Dim str As String
    Dim Con As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\FS-Reseption\AppData\Local\VirtualStore\Program Files (x86)\Anticafe\base\Card.mdb;Persist Security Info=True;Jet OLEDB:Database Password=dead12345") ' Переменная для подключения базы
    'Dim Con As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\base\Card.mdb;Persist Security Info=True;Jet OLEDB:Database Password=dead12345") ' Переменная для подключения базы
    Dim SqlCom As OleDb.OleDbCommand
    Dim DT As New Data.DataTable
    Dim DA As OleDb.OleDbDataAdapter
    Dim One As Integer
    Dim Two As Integer
    Dim BasePath As String
    Dim Soob As Integer



    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    End Sub

    ' ================== Кнопка на добавление средств
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        SqlCom = New OleDb.OleDbCommand("SELECT * FROM `NumberDisc` WHERE `Number` like '%" & "0001" + TextBox1.Text & "%'", Con)
        Con.Open()
        SqlCom.ExecuteNonQuery()
        DA = New OleDb.OleDbDataAdapter(SqlCom)
        DA.Fill(DT)
        Con.Close()
        On Error Resume Next
        Me.TextBox2.DataBindings.Add(New Binding("Text", DT, "Name"))
        Me.TextBox3.DataBindings.Add(New Binding("Text", DT, "Discount"))
        Me.TextBox4.DataBindings.Add(New Binding("Text", DT, "Telephone"))
        Me.TextBox5.DataBindings.Add(New Binding("Text", DT, "Bonus"))

        Soob = MsgBox("Начислить клиенту " & TextBox6.Text & " рублей?", 36, "Подтверждение действия")
        If Soob = 6 Then
            'логирование
            One = TextBox5.Text
            Two = TextBox6.Text
            'IO.File.AppendAllText("D:/File.txt", DateString & " " & TimeOfDay & vbTab & "Номер карты: " & TextBox1.Text & vbTab & "Зачислено: " & TextBox6.Text & vbTab & "Было: " & One & vbTab & "Стало: " & One + Two & vbCrLf) ' Запись текста из TextBox1 в File.txt
            IO.File.AppendAllText("\\nas\Docs\DepositLog\Log.txt", DateString & " " & TimeOfDay & vbTab & "Номер карты: " & TextBox1.Text & vbTab & "Зачислено: " & TextBox6.Text & vbTab & "Было: " & One & vbTab & "Стало: " & One + Two & vbCrLf) ' Запись текста из TextBox1 в File.txt
            'конец логирования
            MsgBox("Сумма начислена: " & Two)
            DT.Clear()
            SqlCom = New OleDb.OleDbCommand("UPDATE [NumberDisc] SET [Bonus]= " & One + Two & " WHERE `Number` like '%" & TextBox1.Text & "%'", Con)
            TextBox1.Clear()
            TextBox6.Clear()
            Con.Open()
            SqlCom.ExecuteNonQuery()
            Con.Close()
        Else
            DT.Clear()
            TextBox1.Clear()
            TextBox6.Clear()
        End If
    End Sub

    ' ======================== Кнопка снятия денег
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        SqlCom = New OleDb.OleDbCommand("SELECT * FROM `NumberDisc` WHERE `Number` like '%" & "0001" + TextBox1.Text & "%'", Con)
        Con.Open()
        SqlCom.ExecuteNonQuery()
        DA = New OleDb.OleDbDataAdapter(SqlCom)
        DA.Fill(DT)
        Con.Close()
        On Error Resume Next
        Me.TextBox2.DataBindings.Add(New Binding("Text", DT, "Name"))
        Me.TextBox3.DataBindings.Add(New Binding("Text", DT, "Discount"))
        Me.TextBox4.DataBindings.Add(New Binding("Text", DT, "Telephone"))
        Me.TextBox5.DataBindings.Add(New Binding("Text", DT, "Bonus"))

        Soob = MsgBox("Снять со счета " & TextBox6.Text & " рублей?", 36, "Подтверждение действия") ' Показываем сообщение, и номер нажатой кнопки записывается в переменную Soob
        If Soob = 6 Then
            'логирование
            One = TextBox5.Text
            Two = TextBox6.Text
            'IO.File.AppendAllText("D:/File.txt", DateString & " " & TimeOfDay & vbTab & "Номер карты: " & TextBox1.Text & vbTab & "Зачислено: " & TextBox6.Text & vbTab & "Было: " & One & vbTab & "Стало: " & One + Two & vbCrLf) ' Запись текста из TextBox1 в File.txt
            IO.File.AppendAllText("\\nas\Docs\DepositLog\Log.txt", DateString & " " & TimeOfDay & vbTab & "Номер карты: " & TextBox1.Text & vbTab & "Зачислено: " & TextBox6.Text & vbTab & "Было: " & One & vbTab & "Стало: " & One + Two & vbCrLf) ' Запись текста из TextBox1 в File.txt
            'конец логирования
            MsgBox("Списано средств: " & Two)
            DT.Clear()
            SqlCom = New OleDb.OleDbCommand("UPDATE [NumberDisc] SET [Bonus]= " & One - Two & " WHERE `Number` like '%" & TextBox1.Text & "%'", Con)
            TextBox1.Clear()
            TextBox6.Clear()
            Con.Open()
            SqlCom.ExecuteNonQuery()
            Con.Close()
        Else
            DT.Clear()
            TextBox1.Clear()
            TextBox6.Clear()
        End If
    End Sub

    Private Sub DataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs)
    End Sub

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        SqlCom = New OleDb.OleDbCommand("SELECT * FROM `NumberDisc` WHERE `Number` like '%" & "0001" + TextBox1.Text & "%'", Con)
        Con.Open()
        SqlCom.ExecuteNonQuery()
        DA = New OleDb.OleDbDataAdapter(SqlCom)
        DA.Fill(DT)
        Con.Close()
        On Error Resume Next
        Me.TextBox2.DataBindings.Add(New Binding("Text", DT, "Name"))
        Me.TextBox3.DataBindings.Add(New Binding("Text", DT, "Discount"))
        Me.TextBox4.DataBindings.Add(New Binding("Text", DT, "Telephone"))
        Me.TextBox5.DataBindings.Add(New Binding("Text", DT, "Bonus"))
        MsgBox("ФИО: " & TextBox2.Text & vbCrLf & "Скидка: " & TextBox3.Text & vbCrLf & "Номер телефона: " & TextBox4.Text & vbCrLf & "Средства на счету: " & TextBox5.Text)
        DT.Clear()
    End Sub
    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
        DT.Clear()
    End Sub
End Class


Тут видно как я костылил с некоторыми вещами... Повесить нужно это всё на Button4.

Iska 27-04-2015 15:51 2501393

Цитата:

Цитата iccup.platoon@vk
Пример таблицы? Прикреплю. »

«Введите пароль базы данных» :).

iccup.platoon@vk 27-04-2015 16:57 2501419

Ой =) dead12345

iccup.platoon@vk 29-04-2015 00:17 2502026

Up =(

lxa85 29-04-2015 00:37 2502030

iccup.platoon@vk, извини, не добрался. Завтра на большом компьютере постараюсь посмотреть

iccup.platoon@vk 01-05-2015 01:00 2502730

UUuup =((((

Iska 01-05-2015 16:36 2502864

iccup.platoon@vk, для Microsoft SQL можно использовать в запросе на обновление данных разновидность функции CASE — т.н. search CASE function (CASE), для Microsoft Access — функцию Switch, наподобие:
Код:

UPDATE [NumberDisc] SET [NumberDisc].Discount = Switch([Amount]<=1,5,[Amount]<=10,10,[Amount]<=15,15,[Amount]>15,20);
но у меня нет уверенности, что сие сработает в Вашем варианте.

lxa85 02-05-2015 18:45 2503107

Вложений: 1
iccup.platoon@vk, у меня получилось так:
Мы говорим CREATE - Query Design
Выбираем нужную таблицу и поле NumberDisc, Discount
Встаем на поле. В ленте DESIGN - выбираем Update
Встаем на поле Update To под Discount
Финт ушами - Ctrl + F2 - открывается Expression Builder
В него пишем
Код:

IIf([NumberDisc]![Amount]>=1 And [NumberDisc]![Amount]<10;5;
  IIf([NumberDisc]![Amount]>=10 And [NumberDisc]![Amount]<15;10;
    IIf([NumberDisc]![Amount]>=15 And [NumberDisc]![Amount]<20;15;
      IIf([NumberDisc]![Amount]>=20;20;-1
      )
    )
  )
)

OK, Run, Подтвердить.
Я на всякий случай делал копию таблицы, но она не пригодилась. Важных данных мы не потеряем.

Теперь как получить нормальную строчку.
Наступили слева в списке на Query.
View (на картинке) - SQL View
И там мы уже видим более привычную строчку SQL запросов.
Вот там можно попробовать способ, предложенный Iska, т.к. CASE он более правильный что ли, при множественном выборе.
Expression Builder мне его повторить не позволил.

Код:

UPDATE NumberDisc
SET NumberDisc.[Discount] =
IIf([NumberDisc]![Amount]>=1 And [NumberDisc]![Amount]<10,5,
    IIf([NumberDisc]![Amount]>=10 And [NumberDisc]![Amount]<15,10,
        IIf([NumberDisc]![Amount]>=15 And [NumberDisc]![Amount]<20,15,
            IIf([NumberDisc]![Amount]>=20,20,-1)
        )
    )
);

Форматирование мое, для наглядности.
Общая конструкция
«Expr» IIf(«expression»; «truepart»; «falsepart»)

Iska 02-05-2015 19:22 2503113

lxa85, в самом Access можно использовать «Switch()», о чём я писал выше.

А вот что из предложенного будет работать извне, из-под Visual Studio в том же VB.Net, например, надо смотреть, пробовать.

lxa85 02-05-2015 20:35 2503124

Iska, проглядел

iccup.platoon@vk 04-05-2015 03:23 2503485

Иска - бог. Снова.

Iska 04-05-2015 15:46 2503666

iccup.platoon@vk, так что именно у Вас заработало из-под VB.Net?

Цитата:

Цитата iccup.platoon@vk
Иска - бог.»

Это совсем не так ;).


Время: 18:20.

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