Войти

Показать полную графическую версию : [решено] vb.net правка access файла


iccup.platoon@vk
27-04-2015, 06:12
Здравствуйте, господа.
Есть файл 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
В чём вопрос-то?

iccup.platoon@vk
27-04-2015, 15:09
В построении цикла с проверкой числа в ячейке амоунт и, на основании информации из нее, изменением числа в ячейке дискоунт. В контроле ацесса я, мягко говоря, еще не силен. В текстовых файлах это WriteLine, а здесь то что? Мне достаточно один раз увидеть - и я запомню =)

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

iccup.platoon@vk
27-04-2015, 15:35
Пример таблицы? Прикреплю. Пример кода? Да я даже с чего начать не знаю =( Вот код того, что постиг:


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
Пример таблицы? Прикреплю. »
«Введите пароль базы данных» :).

iccup.platoon@vk
27-04-2015, 16:57
Ой =) dead12345

iccup.platoon@vk
29-04-2015, 00:17
Up =(

lxa85
29-04-2015, 00:37
iccup.platoon@vk, извини, не добрался. Завтра на большом компьютере постараюсь посмотреть

iccup.platoon@vk
01-05-2015, 01:00
UUuup =((((

Iska
01-05-2015, 16:36
iccup.platoon@vk, для Microsoft SQL можно использовать в запросе на обновление данных разновидность функции CASE — т.н. search CASE function (CASE (https://technet.microsoft.com/en-us/library/aa258235(v=sql.80).aspx)), для 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
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
lxa85, в самом Access можно использовать «Switch()», о чём я писал выше.

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

lxa85
02-05-2015, 20:35
Iska, проглядел

iccup.platoon@vk
04-05-2015, 03:23
Иска - бог. Снова.

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

Иска - бог.»
Это совсем не так ;).




© OSzone.net 2001-2012