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

Форум: MS ACCESS

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

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

 
 

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

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

тема: запрос на обновление............
 
 автор: Kaktus   (10.10.2006 в 17:03)   личное сообщение
 
 

недавно на ентом же форуме мне помогли с запросом на обновление.........
всЁ сработало просто на ура, и работает до сих пор............
вот листинг того запроса:

UPDATE Otgruzka SET Otgruzka.NomerKontrakta = [Forms].[Поиск].[NomerKontrakta], Otgruzka.PlatezhPoKontraktu = [Otgruzka].[PlatezhPoKontraktu]+[Forms].[Поиск].[SummaInvoisa]
WHERE (((Otgruzka.NomerInvoisa)=[Forms].[Поиск].[NomerRealInvoisa]));

сегодня сижу и пытаюсь прописать другой запрос на обновление, вот его листинг:

UPDATE Подчиненная_Ввоз, Подчиненная_Заказ SET Подчиненная_Заказ.ПлатежПоКонтракту = Подчиненная_Заказ.ПлатежПоКонтракту+Forms!Polycarbonate!Подчиненная_Ввоз.Form!СуммаИнвойса
WHERE (((Подчиненная_Заказ.НомерИнвойса)=[Forms]![Polycarbonate]![Подчиненная_Ввоз].[Form]![НомерРеалИнвойса]));

но что самое интересное, в чем собственно говоря проблема, он прибавляет удвоеное значение (Forms!Polycarbonate!Подчиненная_Ввоз.Form!СуммаИнвойса)...................

если оно равнялось 5 то он прибавит 10, если 7 то 14...........

можно конечно тупо складывать значение поделенно на два, но ведь енто не праваильно............

могет я накосячил, то простите меня............
я просто уже 12 часов за компом и вообще не соображаю............
а найти ошибку темболее .......................
могет подскажет почему двоит?.........
или енто у меня в мозгах уже двоит.............

  Ответить  
 
 автор: ДрЮня   (10.10.2006 в 18:09)   личное сообщение
 
 

скорее всего, в этом инвойсе 2 позиции
если будет 3 позиции - будет утроивать.
попробуйте построить построителем Ваш запрос и посмотреть кол-во записей, которое возвращает запрос.

РС
переходите на АДО - можно контролировать все операции

  Ответить  
 
 автор: Kaktus   (11.10.2006 в 07:14)   личное сообщение
 
 

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

http://hiprog.com/access/article.asp?id=359

но она не рабочая..................
могет ктонить помочь?.................

  Ответить  
 
 автор: osmor   (11.10.2006 в 08:37)   личное сообщение
 
 

эта ссылка не на кол-вл строк с таблице, а на нумерацию строк запроса:
http://hiprog.com/index.php?option=com_content&task=view&id=359&Itemid=35
кол-во записей в форме можно посчитать так:
http://hiprog.com/index.php?option=com_content&task=view&id=121

  Ответить  
 
 автор: alecks_lp   (11.10.2006 в 08:51)   личное сообщение
 
 

Отказался я от запросов SQL. Перешел на ADO. Коду больше, но понятней и гибче(у Гетца - a great deal of flexibility ).

  Ответить  
 
 автор: osmor   (11.10.2006 в 09:59)   личное сообщение
 
 


Отказался я от запросов SQL. Перешел на ADO

мне кажется Вы путаете понятия.
ADO - механизм доступа к данным
SQL - язык запросов

можно отказаться от JET или DAO в пользу ADO, но никак от SQL в пользу ADO.
rst.open "select * from tbl" .....
это разве не SQL?

IMHO, исполнение запроса на обнолвение (методами JET, ADO или DAO), всегда быстрее чем построчная работа с рекордсетом.

  Ответить  
 
 автор: Filosof   (11.10.2006 в 10:17)   личное сообщение
 
 

>IMHO, исполнение запроса на обнолвение (методами JET, ADO
>или DAO), всегда быстрее чем построчная работа с
>рекордсетом.
Ну не всегда я считал сумму с накопление в запросе короче имел в запросе еще пару подчиненных запросв рассчитывал остатки на складе по дням для постороения графика и в конце перешел на заполнение временной таблицы с помощью рекордсета и остатки за 365 дней расчитываю для руководства на порядок быстрее чем запросом

  Ответить  
 
 автор: osmor   (11.10.2006 в 10:25)   личное сообщение
 
 

>перешел на заполнение временной таблицы с помощью рекордсета
А если временную таблицу заполнять запросом на добавление, IMHO, будет еще быстрее.
Мое личное убеждение:
"всегда и везде, где возможно, использовать .EXECUTE вместо
.EDIT (.ADDNEW) + .UPDATE

  Ответить  
 
 автор: Filosof   (11.10.2006 в 10:30)   личное сообщение
 
 

>>перешел на заполнение временной таблицы с помощью
>рекордсета
>А если временную таблицу заполнять запросом на добавление,
>IMHO, будет еще быстрее.
>Мое личное убеждение:
>"всегда и везде, где возможно, использовать .EXECUTE
>вместо
>.EDIT (.ADDNEW) + .UPDATE
до этого так и было заполнял временную таблицу через запрос на добавления
Но возможно у меня случай особый там сначала запрос на объединение расхода и прихода да еще таблицы со всеми датами с нулями что бы, точно все даты присутствовали на графике

  Ответить  
 
 автор: alecks_lp   (11.10.2006 в 14:15)   личное сообщение
 
 

Если запрос на обновление обслуживает одну таблицу и расчеты относительно просты, то работать с ним легко, приятно и быстро: EXECUTE - будьте любезны. Если для расчета требуются данные из нескольких таблиц, данные подлежат проверке, обработке и пр. - без вложенных запросов врядли обойдешься, а это уже не так быстро работает. Конечно, я погорячился, заявив, что отказался от SQL, но в подобных случаях я выбираю ADO, открываю необходимое количество рекордсетов, некоторые из них просто служат массивами данных, а разумное использование курсора и методов блокировки дает хорошие результаты. Кроме того, в этом случае алгоритм расчета можно записать в таблицу, и для изменения параметров расчета достаточно добавить(удалить) строку, столбец, отредактировать таблицу ) а не редактировать код. Что же до: rst.Open "Select * from tbl", то можно rst.Open "tblName"

  Ответить  
 
 автор: osmor   (11.10.2006 в 14:46)   личное сообщение
 
 

Так я ж не спорю. Просто это разные понятия SQL и ADO.
И так-то встрял только для того, что бы у начинающих, не возникло в голове каши из понятий SQL и ADO.

  Ответить  
 
 автор: Kaktus   (11.10.2006 в 16:17)   личное сообщение
 
 

ничего себе дискуссия................
енто конечно приятно, что задета такая наболевшая тема.................
и людей она интересует, но ощущаю я себя честно говоря не лучшим бразом, как бы слегка малограмотным..................
так вот..........
вернумся к нашим баранам..................

я на форме приляпал кнопку34 и поле35...........
и на "нажате кнопки " повесил следующее....................

Private Sub кнопка34_Click()

Dim rstSrc As Recordset
Set rstSrc = Me.Form.RecordsetClone
If rstSrc.RecordCount < 1 Then ' нет записей в форме
MsgBox "в форме отсутствуют строки", vbInformation, "Ошибка"
Exit Sub
End If '.RecordCount < 1
With rstSrc
.MoveLast
.MoveFirst
End With

поле35.Value = rstSrc.RecordCount

End Sub

но при нажатии выдает ошибку :

compile error
user-defined type not defined.

ну так вот ...............
поумничали теоретически..........
пора бласнуть практическими знаниями..............
подскажите малограмотному самоучке.............
как говориться - сами мы не местные и т.д. и т.п...................

  Ответить  
 
 автор: osmor   (11.10.2006 в 16:23)   личное сообщение
 
 

http://hiprog.com/index.php?option=com_content&task=blogcategory&id=119&Itemid=159
вопрос №2

  Ответить  
 
 автор: Kaktus   (11.10.2006 в 16:39)   личное сообщение
 
 

>http://hiprog.com/index.php?option=com_content&task=blogcategory&id=119&Itemid=159
>вопрос №2

>Отсюда вывод:
>нужно явно описывать тип рекордсета который вы будете использовать, тогда вы не будете >зависить от порядка подключения библиотек.

>dim srt as DAO.Recordset

>или

>dim rst as ADODB.recordset


пробовал оба варианта..............
тот же результат...............

причем выделяет желты строку

>Private Sub кнопка34_Click()

так в чем же ошибка.???........

  Ответить  
 
 автор: osmor   (11.10.2006 в 17:09)   личное сообщение
 
 

Вам нужно подключить библиотеку DAO

  Ответить  
 
 автор: alecks_lp   (12.10.2006 в 08:46)   личное сообщение
 
 

Public Function RecordCounter(frm As Form) As Variant
On Error GoTo ErrorHandler
Dim rs As DAO.Recordset
Set rs = frm.Recordset.Clone

If rs.BOF And rs.EOF Then
RecordCounter= "Нет записей"
Else
rs.MoveLast
rs.MoveFirst
RecordCounter=rs.RecordCount

End If

ErrorHandler:

Set rs = Nothing

If Err <> 0 Then
MsgBox Err.Source & "-->" & Err.Description, , "Ошибка"
End If

Private Sub кнопка34_Click()
поле35.Value = RecordCounter(Me)
End Sub

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