Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Наведите на мыслю
 
 автор: Гоблин   (13.11.2011 в 17:01)   личное сообщение
 
 

Привет все.
Народ, наведите на мыслю. Есть свободная форма с полями "Надпись1....17", "ПолеL1...17", полеN1....17", "ПолеW1...17", "REZ1...17" которые при открытии заполняются из таблицы, если есть данные или остаются пустыми, если данных нет. В процессе работы заполняются поля, изменяются некие данные что загрузились из таблицы, происходят вычисления. Теперь все то, что там записалось, вычислилось и изменилось, требуется сохранить в таблицу. Циклом могу собрать данные, которые имеют результаты <>0 (поле REZ1...17) Как-то построчно надо по этой форме пройтись по всем 17 строкам. Форма не ленточная. recordset что ли как-то присобачить или все же циклом? И как из этого состряпать некий запрос, скажем на добавление или изменение. Или и то и другое вместе взятое?

  Ответить  
 
 автор: snipe   (13.11.2011 в 17:25)   личное сообщение
 
 

А табла какую структуру имеет?
хоть пример забабахай а то не удобственно как-то придумывать

  Ответить  
 
 автор: Гоблин   (13.11.2011 в 17:36)   личное сообщение
 
 

Да вот с этим как раз работаю. Ща выдерну из базы минимум, скину.

  Ответить  
 
 автор: snipe   (13.11.2011 в 18:12)   личное сообщение
 
 

для одной строки
docmd.runsql "INSERT INTO Таблица1 ( Поле1, Поле2 ) SELECT [Forms]![форма1]![поле0] AS Поле1, [Forms]![форма1]![поле8] AS Поле2;"

  Ответить  
 
 автор: Гоблин   (13.11.2011 в 19:16)   личное сообщение
 
 

Думал на эту тему. Все закинуть в цикл для всех строк. Проблема еще в том, что бы если изменять данные, то запускать запрос на обновление, что бы не добавлять лишнюю инфу в таблицу. И вот тут-то и загвоздка. Как-то рекордсет надо что ли для сравнения что есть и что в форме. Или при открытии как-то значение присваивать. Или при сохранении пробежать по тому, что уже есть и сравнить-обновить а затем добавить недостающее. В общем каша полная. А может это и есть решение?

  Ответить  
 
 автор: Гоблин   (13.11.2011 в 18:33)   личное сообщение
 
 

Все что мог удалил, оставил выжимку, но и она в архиве 200кб. Пришлось на залить http://zalil.ru/32048198 Гляньте кто может?

  Ответить  
 
 автор: час   (13.11.2011 в 19:25)   личное сообщение
 
 

Вон снайпер тебе классную штуку написал

  Ответить  
 
 автор: Гоблин   (13.11.2011 в 20:47)   личное сообщение
 
 

Да вот пока еще недопонял. Пытаюсь разобраться применительно к себе.

  Ответить  
 
 автор: час   (14.11.2011 в 00:04)   личное сообщение
 
 

Здрасти.....
Он тебе советует запросом на обновление вставлять данные в таблицу, а брать их с полей на форме.
---------------------------------
теперя врубаисси?

сохранять надо из результаты?
или L в L

INSERT INTO Биометрия ( L )
SELECT [Forms]![Расчет биометрии]![L1] AS Выражение1

  Ответить  
 
 автор: Гоблин   (14.11.2011 в 18:22)   личное сообщение
 
 

У меня примерно так и работает. CurrentDb.Execute "insert into Биометрия (КодПротОбл, Параметр, L, H, W, T) values ('" & Me.Поле1 & "', '" & Me("Надпись" & i).Caption & "', " _
& " " & Nz(Me("L" & i), 0) & ", " & Nz(Me("H" & i), 0) & ", " & Nz(Me("W" & i), 0) & ", " & Nz(Me("T" & i), 0) & ");"

И добавляет. Но проблема в том, что надо определить (рекордсетом или как-то еще) что уже введено, сравнить с тем, что есть и далее программно где-то запускать запрос на обновление, а если новый параметр добавился, то еще и на добавление.
Проблема в механизме всего этого. На обновление можно запускать в любом случае по имеющимся в таблице строкам. А если их в таблице меньше, чем заполнено в форме, то недостающие запросом на добавление.
Так вот на обновление в цикле не катит. Он то по последней строке бьет, то все по первой обновляет. Может передавать в форму еще и данные id и ссылаться на текущий в цикле id по условию... В общем поиск решения.

  Ответить  
 
 автор: Гоблин   (14.11.2011 в 21:07)   личное сообщение
 
 

Все сделал! Сам же себя на мыслю и навел. Вот как оно работает: ID при открытии формы заполняется где оно есть. Далее заполняем форму, затем закрываем. ПРи закрытии пробегаем по всем строкам формы. Там где id заполнен, там он выступает в роли условия запроса на обновление результата. Там, где его нет, срабатывает запрос на добавление, после чего рекордсетом (новых строк может быть много добавлено) ставим новое знаение id в соответствующую строку, после чего по ней может работать только обновление. УСЕ

a = DCount("Параметр", "[Спр Биометрия]", "ОблИсследования='" & [Forms]![Пациенты]![подчиненная форма Протокол область].[Form]![ОбластьИсследования] & "'")
DoCmd.SetWarnings False

For i = 1 To a
If (Nz(Me("rez" & i), 0) <> 0 Or Nz(Me("L" & i), 0) <> 0 Or Nz(Me("H" & i), 0) <> 0 Or Nz(Me("w" & i), 0) <> 0 Or Nz(Me("T" & i), 0) <> 0) And Nz(Me("id" & i), 0) = 0 Then
CurrentDb.Execute "insert into Биометрия (КодПротОбл, Параметр, L, H, W, T) values ('" & Me.Поле1 & "', '" & Me("Надпись" & i).Caption & "', " _
& " " & Nz(Me("L" & i), 0) & ", " & Nz(Me("H" & i), 0) & ", " & Nz(Me("W" & i), 0) & ", " & Nz(Me("T" & i), 0) & " );"

Set rst = CurrentDb.OpenRecordset("SELECT Биометрия.КодБиометрии, Биометрия.Параметр, Биометрия.L, Биометрия.H, Биометрия.W, Биометрия.T, " _
& " [Протокол область].КодПротОбл FROM [Протокол область] RIGHT JOIN Биометрия ON [Протокол область].КодПротОбл = Биометрия.КодПротОбл " _
& " WHERE ((([Протокол область].КодПротОбл)=" & [Forms]![Пациенты]![подчиненная форма Протокол область].[Form]![КодПротОбл] & "));")
With rst
Do While Not .EOF
Me("id" & i) = !КодБиометрии
.MoveNext
Loop
End With

Else
If (Nz(Me("rez" & i), 0) <> 0 Or (Me("L" & i) <> 0 Or Nz(Me("H" & i), 0) <> 0 Or Nz(Me("H" & i), 0) <> 0 Or Nz(Me("T" & i), 0) <> 0)) And Nz(Me("id" & i), 0) <> 0 Then
MsgBox ("Обновляем значение" & " " & Me("Буква" & i))
DoCmd.RunSQL "UPDATE Биометрия SET Биометрия.L = " & Me("L" & i) & ", Биометрия.H = " & Me("H" & i) & ", Биометрия.W = " & Me("W" & i) & ", " _
& " Биометрия.T = " & Me("T" & i) & " WHERE (((Биометрия.КодБиометрии)=" & Me("id" & i) & "));"
End If
End If
Next i

  Ответить  
 
 автор: час   (15.11.2011 в 00:01)   личное сообщение
 
 

Ах ты вон чего спрашивал..........
Я тады просто вопроса не понял
Звиняюся за пестолковости

  Ответить  
 
 автор: Гоблин   (15.11.2011 в 18:48)   личное сообщение
 
 

Ну наверно не так изложил проблему. Нужен был механизм всего этого. А так, в базе работает немного видоизмененная ваша функция. Очень пригодилась.

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList