Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Recordset для Insert / 22 сообщений из 22, страница 1 из 1
06.04.2016, 21:51
    #39209689
recordset
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordset для Insert
Вместо 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
06.04.2016, 23:07
    #39209716
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordset для Insert
По записям надо пройтись циклом (не надо только пытаться сделать равными ключи-счетчики)
Код: 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
07.04.2016, 11:34
    #39209963
recordset
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordset для Insert
sdku,

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

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

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

может таблицы очень большие или сеть
...
Рейтинг: 0 / 0
07.04.2016, 12:50
    #39210077
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordset для Insert
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
07.04.2016, 13:57
    #39210147
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordset для Insert
recordsetsdku,
...вставка 160 записей заняло 3 минуты....
Это не просто долго-оооочень долго
копирование 1001 записи из 4 полей занимает 0.0546875 сек. Попробуйте проделать это на свободных (не связанных таблицах) убедитесь что это так (время может колебаться в зависимости от быстродействия РС) и ищите ошибку в структуре БД
...
Рейтинг: 0 / 0
07.04.2016, 14:03
    #39210155
Recordset для Insert
recordsetгде-то на форуме прочитал, что лучше использовать Recordset вместо INSERT. Это справедливо в случаях:
1. Вместо использования INSERT... VALUES или INSERT...FROM с использованием конкретных значений;
2. Если после добавления записи вам понадобится ее ID (счетчик), например, для добавления записей в подчиненную таблицу.
...
Рейтинг: 0 / 0
07.04.2016, 14:22
    #39210183
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordset для Insert
Так долго может работать, если таблицы большие (десятки тысяч записей и более) и при этом отсутствуют индексы на полях, по которым соединяются таблицы и отбираются записи. Not IN также "плохая" операция, заставляет сканировать всю таблицу.
Еще дикие тормоза даже на небольших таблицах могут возникнуть, если неграмотно использованы макросы данных, вызывающие какие-то долгие вычисления при вставке каждой строкию
...
Рейтинг: 0 / 0
07.04.2016, 15:11
    #39210252
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordset для Insert
Попробуйте
Код: 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
07.04.2016, 20:08
    #39210553
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordset для Insert
__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
08.04.2016, 10:34
    #39210807
recordset
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordset для Insert
MrShinТак долго может работать, если таблицы большие (десятки тысяч записей и более) и при этом отсутствуют индексы на полях, по которым соединяются таблицы и отбираются записи. Not IN также "плохая" операция, заставляет сканировать всю таблицу.
Еще дикие тормоза даже на небольших таблицах могут возникнуть, если неграмотно использованы макросы данных, вызывающие какие-то долгие вычисления при вставке каждой строкию

Раз 160 записей должно вставляться за секунду, то стоит задуматься. Таблица, куда вставляется, действительно большая и отбор записей получается, идет по всей таблице. И индексы не сделаны, просто связи между таблицами составлены.
...
Рейтинг: 0 / 0
08.04.2016, 10:59
    #39210837
recordset
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordset для Insert
__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
08.04.2016, 11:09
    #39210848
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordset для Insert
recordset,

Пожалуйста.)))
Этот запрос называется Записи без подчиненных.
Посмотрите о нем информацию.
...
Рейтинг: 0 / 0
08.04.2016, 11:58
    #39210925
recordset
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordset для Insert
У меня возник еще один вопрос по части вставки. Случайно взглянул на поле 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
08.04.2016, 12:39
    #39210969
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordset для Insert
recordsetПочему вначале через один менялась нумерация, а в конце нормально нумеровал?
Скорее всегопропущеные строки были просто удалены. Генерируется всегда последовательно, если не пытаться вставить запись в поле с автонумерацией явно (через insert или рекордсетом)
...
Рейтинг: 0 / 0
08.04.2016, 12:44
    #39210973
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordset для Insert
MrShin,

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

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

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

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

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

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


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