powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Recordset для Insert
22 сообщений из 22, страница 1 из 1
Recordset для Insert
    #39209689
recordset
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вместо INSERT хочу использовать Recordset и мне нужно переделать код, если кто сможет помочь, буду благодарен.

Код: vbnet
1.
2.
3.
4.
5.
INSERT INTO baza (IDpatient, IDtest, cena)
SELECT V.IDpatient, V.IDtest, Str(V.cena) 
FROM tab_q_2 AS V
WHERE Not Exists (SELECT B.IDpatient, B.IDtest, B.cena FROM baza B
             WHERE B.IDpatient= V.IDpatientAND B.IDtest= V.IDtest)



Наброски кода:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("baza", dbOpenDynaset)

Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("tab_q_2", dbOpenDynaset)

rs.AddNew  
    rs("IDpatient") = rst!IDpatient
    rs("IDtest") = rst!IDtest
    rs("cena") = rst!cena
rs.Update

rst.Close
Set rs = Nothing

rs.Close
Set rs = Nothing
...
Рейтинг: 0 / 0
Recordset для Insert
    #39209716
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По записям надо пройтись циклом (не надо только пытаться сделать равными ключи-счетчики)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Dim  rs1 As DAO.Recordset, rs2 As DAO.Recordset
CurrentDb.Execute "DELETE копия.* FROM копия;"
Set rs1 = CurrentDb.OpenRecordset("таблица")'или инструкция SQL
Set rs2 = CurrentDb.OpenRecordset("копия")
Do Until rs1.EOF
rs2.AddNew
rs2!ctl1 = rs1!ctl1
rs2!ctl2 = rs1!ctl2
rs2!ctl3 = rs1!ctl3
rs2!ctl4 = rs1!ctl4
rs2.Update
rs1.MoveNext
Loop
...
Рейтинг: 0 / 0
Recordset для Insert
    #39209963
recordset
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdku,

Огромное спасибо, получилось!!!

У меня только один вопрос, где-то на форуме прочитал, что лучше использовать Recordset вместо INSERT. Сейчас время посчитал, всё равно долго шел запрос, вставка 160 записей заняло 3 минуты. Это нормальное явление или можно еще как-то ускорить?
...
Рейтинг: 0 / 0
Recordset для Insert
    #39210073
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
recordset,

многовато что-то

может таблицы очень большие или сеть
...
Рейтинг: 0 / 0
Recordset для Insert
    #39210077
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
recordset,

и запрос типа
Код: sql
1.
2.
3.
4.
SELECT V.IDpatient, V.IDtest, Str(V.cena) 
FROM tab_q_2 AS V
WHERE Not Exists (SELECT B.IDpatient, B.IDtest, B.cena FROM baza B
             WHERE B.IDpatient= V.IDpatientAND B.IDtest= V.IDtest)
...
Рейтинг: 0 / 0
Recordset для Insert
    #39210147
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
recordsetsdku,
...вставка 160 записей заняло 3 минуты....
Это не просто долго-оооочень долго
копирование 1001 записи из 4 полей занимает 0.0546875 сек. Попробуйте проделать это на свободных (не связанных таблицах) убедитесь что это так (время может колебаться в зависимости от быстродействия РС) и ищите ошибку в структуре БД
...
Рейтинг: 0 / 0
Recordset для Insert
    #39210155
recordsetгде-то на форуме прочитал, что лучше использовать Recordset вместо INSERT. Это справедливо в случаях:
1. Вместо использования INSERT... VALUES или INSERT...FROM с использованием конкретных значений;
2. Если после добавления записи вам понадобится ее ID (счетчик), например, для добавления записей в подчиненную таблицу.
...
Рейтинг: 0 / 0
Recordset для Insert
    #39210183
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так долго может работать, если таблицы большие (десятки тысяч записей и более) и при этом отсутствуют индексы на полях, по которым соединяются таблицы и отбираются записи. Not IN также "плохая" операция, заставляет сканировать всю таблицу.
Еще дикие тормоза даже на небольших таблицах могут возникнуть, если неграмотно использованы макросы данных, вызывающие какие-то долгие вычисления при вставке каждой строкию
...
Рейтинг: 0 / 0
Recordset для Insert
    #39210252
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте
Код: sql
1.
2.
3.
4.
INSERT INTO baza (IDpatient, IDtest, cena) 
SELECT V.IDpatient, V.IDtest, Str(V.cena) FROM tab_q_2 AS V 
LEFT JOIN baza AS B ON B.IDpatient= V.IDpatient AND B.IDtest=5V.IDtest 
WHERE B.IDpatient Is Null And B.IDtest Is Null
...
Рейтинг: 0 / 0
Recordset для Insert
    #39210553
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__MichelleПопробуйте
Код: sql
1.
2.
3.
4.
INSERT INTO baza (IDpatient, IDtest, cena) 
SELECT V.IDpatient, V.IDtest, Str(V.cena) FROM tab_q_2 AS V 
LEFT JOIN baza AS B ON B.IDpatient=V.IDpatient AND B.IDtest=5V.IDtest 
WHERE B.IDpatient Is Null And B.IDtest Is Null

Заметила опечатку – днем писала с планшета.
Помечено красным, какая-то пятерка вкралась.
...
Рейтинг: 0 / 0
Recordset для Insert
    #39210807
recordset
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MrShinТак долго может работать, если таблицы большие (десятки тысяч записей и более) и при этом отсутствуют индексы на полях, по которым соединяются таблицы и отбираются записи. Not IN также "плохая" операция, заставляет сканировать всю таблицу.
Еще дикие тормоза даже на небольших таблицах могут возникнуть, если неграмотно использованы макросы данных, вызывающие какие-то долгие вычисления при вставке каждой строкию

Раз 160 записей должно вставляться за секунду, то стоит задуматься. Таблица, куда вставляется, действительно большая и отбор записей получается, идет по всей таблице. И индексы не сделаны, просто связи между таблицами составлены.
...
Рейтинг: 0 / 0
Recordset для Insert
    #39210837
recordset
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__MichelleПопробуйте
Код: sql
1.
2.
3.
4.
INSERT INTO baza (IDpatient, IDtest, cena) 
SELECT V.IDpatient, V.IDtest, Str(V.cena) FROM tab_q_2 AS V 
LEFT JOIN baza AS B ON B.IDpatient= V.IDpatient AND B.IDtest=5V.IDtest 
WHERE B.IDpatient Is Null And B.IDtest Is Null



Да, так тоже получилось и очень быстро вставились записи. Огромное спасибо за помощь.
...
Рейтинг: 0 / 0
Recordset для Insert
    #39210848
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
recordset,

Пожалуйста.)))
Этот запрос называется Записи без подчиненных.
Посмотрите о нем информацию.
...
Рейтинг: 0 / 0
Recordset для Insert
    #39210925
recordset
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня возник еще один вопрос по части вставки. Случайно взглянул на поле IDbaza из таблицы baza. Для него включено автонумерация. Почему вначале через один менялась нумерация, а в конце нормально нумеровал? Устал прыгать?

427
429
432
435
436
439
442
444
450
452
453
455
457
459
461
463
465
467
469
471
473
475
477
479
481
483
484
486
488
490
492
494
496
498
500
502
504
506
508
510
512
513
515
517
519
521
523
525
527
529
531
536
540
542
544
546
548
550
552
554
556
558
560
562
564
566
568
570
572
574
576
578
580
582
584
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
...
Рейтинг: 0 / 0
Recordset для Insert
    #39210969
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
recordsetПочему вначале через один менялась нумерация, а в конце нормально нумеровал?
Скорее всегопропущеные строки были просто удалены. Генерируется всегда последовательно, если не пытаться вставить запись в поле с автонумерацией явно (через insert или рекордсетом)
...
Рейтинг: 0 / 0
Recordset для Insert
    #39210973
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrShin,

Разве получится вставить свое значение в поле счетчик?
...
Рейтинг: 0 / 0
Recordset для Insert
    #39210985
recordset
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__Michelle,

Я и не собирался вставлять пропущенные значения. Это следствие вышеуказанной операции INSERT и никакие действия по удалению не производились. И мне непонятно почему так получилось.
...
Рейтинг: 0 / 0
Recordset для Insert
    #39210990
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
recordset,

Это был не к Вам вопрос.MrShin Генерируется всегда последовательно,
если не пытаться вставить запись в поле с автонумерацией явно (через insert или рекордсетом)
...
Рейтинг: 0 / 0
Recordset для Insert
    #39210997
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__MichelleРазве получится вставить свое значение в поле счетчик?
Конечно! Я так иногда сбрасываю счетчики после тестирования, чтобы нумерация шла с 1.
Не стоит только пытаться вставить значение в конструкторе в режиме редактирования данных.
После вставки акцесс продолжит нумеровать с этого значения, а не с максимального, так что могут возникнуть дубликаты записей в поле с автонумерацией, если нет уникального индекса на это поле.
...
Рейтинг: 0 / 0
Recordset для Insert
    #39211023
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrShin,

В конструкторе я вообще подобных манипуляций не проделываю.

Сбрасываются счетчики обычно сжатием базы.
А у Вас как-то иначе это делается?
...
Рейтинг: 0 / 0
Recordset для Insert
    #39211055
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__MichelleСбрасываются счетчики обычно сжатием базы
Да уж. Не знал, спасибо :)
Но все равно иногда требуется прямая вставка, например при апгрейде бэкэнда скриптами, когда сжатие запускать нельзя
...
Рейтинг: 0 / 0
Recordset для Insert
    #39211274
recordset
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С нумерацией оказывается всё в порядке, вразброску записал данные.

Еще раз спасибо)
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Recordset для Insert
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]