2015-05-19 1 views
0

Я написал append запросы, которые берут записи из двух подформ и вставляют их в таблицу элементов счетов. В любом запросе результаты одинаковы и только то, что я хочу, за исключением того, что если он будет запущен снова после добавления новой записи, он создаст дубликаты уже добавленных записей. Я попытался использовать SELECT DISTINCT в предложении where для поля ID для подформы (Hours.ID), но ничего не делает для изменения результатов. Смотри ниже.Мне нужно предотвратить дубликаты в запросе на добавление доступа

Таблица счетов-фактур = LineItemID | ProjectID | Название проекта | HoursID | Следователь | Дата работы | Зарабатываемые часы | WorkCode | WorkCodeText | Заряд | Всего Расходы

Запрос захватывает поля из двух таблиц для вставки в таблицу позиций с этими аргументами:

INSERT INTO tblInvoiceLineItems (
    ProjectID 
    ,ProjectName 
    ,Investigator 
    ,DateWorked 
    ,BillableHours 
    ,Charge 
    ,TotalCharges 
    ,WorkCode 
    ,[WorkCodeText] 
    ,HoursID 
    ) 
SELECT [Project Hours].Project 
    ,[Project Hours].ProjectName 
    ,[Project Hours].Investigator 
    ,[Project Hours].[Date Worked] 
    ,[Project Hours].[Billable Hours] 
    ,tblWorkCodes.Charge 
    ,[Project Hours] ! [Billable Hours] * [tblWorkCodes] ! [Charge] AS [Total Service Charges] 
    ,[Project Hours].[Work Code] 
    ,tblWorkCodes.WorkCode 
    ,[Project Hours].ID 
FROM tblWorkCodes 
INNER JOIN [Project Hours] ON tblWorkCodes.WorkCodeID = [Project Hours].[Work Code] 
WHERE (
     (([Project Hours].Project) = [Enter ID]) 
     AND (
      ([Project Hours].ID) IN (
       SELECT DISTINCT [Project Hours].ID 
       FROM [Project Hours] 
       ) 
      ) 
     ); 

Все хорошо, кроме последней части, где я пытаюсь добавить отличный выбор Hour таблицы ID, которое запускается, но не обрабатывает предполагаемый результат. Если запись добавляется в таблицу часов через подчиненную форму и выполняется запрос append, я получаю все записи не только новой записи. Я хочу добавить новую запись и «сохранить и закрыть», в результате чего я вызову запрос append, чтобы добавить только новую запись. Спасибо за выполнение этой задачи. Образец данных состоит в том, что таблица часов содержит две записи данных для каждого столбца, где идентификаторы часов - 43, а 8. другие данные не имеют значения, поэтому я не буду скучать никому со всеми данными столбца. RE-запуск запроса append ранее добавлял еще две записи с теми же данными и идентификаторами 43 и 8. С новым решением ниже я теперь не получаю никаких записей, если вставленные записи уже существуют в таблице позиций счетов-фактур.

ОК я решить, что теперь путем вставки следующего после того, как и» ("ID" <> (SELECT [tblInvoiceLineItems] [HoursID] ОТ [tblInvoiceLineItems]).));

я не сделал что мне нужна вторая инструкция SELECT для сравнения идентификаторов часов с идентификатором Hours ID в целевой таблице. Он отлично работает для этой таблицы и запроса, но не для моего другого, который похож, но я думаю, что мне не хватает леса для Если кто-то хочет взять удар, возможно, вы можете обнаружить мою ошибку.

Этот номер имеет следующую таблицу: [Расходы по проекту]. Работник, [Проект Расходы] [расходов Дата], [Расходы проекта] [Расходы Code], [Расходы проекта] .Amount [Расходы проекта] .Amount, ID

SQL:.. INSERT INTO tblInvoiceLineItems (ProjectID, ProjectName, следователь, ExpenseDate, ExpenseCode, ExpenseAmount, TotalCharges, ExpensesID) SELECT Projects.ID, Проекты. [Название проекта], [Расходы проекта]. Сотрудник, [Расходы проекта]. [Дата платежа], [Расходы по проекту]. [Код расходов] [Расходы по проекту] .Amount, [Расходы проекта] .Amount, [Расходы проекта] .ID ОТ ПРОЕКТОВ LEFT JOIN [Расходы по проекту] ON Projects.ID = [Расходы по проекту] .Project GROUP BY Projects.ID, Projects. [ Название проекта], [Расходы по проекту]. Сотрудник, [Расходы проекта]. [Дата платежа], [Расходы по проекту]. [Код расходов], [Расходы по проекту] .Амонт, [Projec t Расходы] .ID HAVING (((Projects.ID) = [введите id]) И ([Расходы проекта]. [ID] <> (SELECT [tblInvoiceLineItems]. [ExpensesID] FROM [tblInvoiceLineItems])));

Итак, я сделал аналогичную инструкцию SELECT, чтобы сравнить Идентификаторы расходов, вставленные с Идентификаторами расходов, уже вставленными в ту же таблицу элементов счетов. Однако, когда я повторно запускаю запрос append, я получаю сообщение «не более одной записи будет добавлено», но затем ничего не добавляется. Есть две записи с идентификаторами 2 и 16 для этой части счета.

Возможно, весь мой подход неэффективен для объединения записей из двух таблиц в таблицу позиций счета-фактуры, из которых я могу отображать позиции и общую сумму для счета-фактуры/отчета. Даже если у кого-то есть лучшая идея, мне очень полезно изучить эту технику добавления, если мне когда-нибудь понадобится это как единственное или лучшее решение. Спасибо всем, кто вносит свой вклад.

+0

Довольно невозможно диагностировать, не видя: 1) Образец данных, 2) Текущие результаты, 3) Желаемые результаты. –

ответ

0

С быстром взглядом Я предполагаю, что [Время работы проекта] .ID следует только когда-либо заходить в таблицу tblInvoiceLineItems?

Как об изменении его

INSERT INTO tblInvoiceLineItems (
ProjectID 
,ProjectName 
,Investigator 
,DateWorked 
,BillableHours 
,Charge 
,TotalCharges 
,WorkCode 
,[WorkCodeText] 
,HoursID 
) 
SELECT DISTINCT [Project Hours].Project 
,[Project Hours].ProjectName 
,[Project Hours].Investigator 
,[Project Hours].[Date Worked] 
,[Project Hours].[Billable Hours] 
,tblWorkCodes.Charge 
,[Project Hours] ! [Billable Hours] * [tblWorkCodes] ! [Charge] AS [Total Service Charges] 
,[Project Hours].[Work Code] 
,tblWorkCodes.WorkCode 
,[Project Hours].ID 
FROM tblWorkCodes 
INNER JOIN [Project Hours] ON tblWorkCodes.WorkCodeID = [Project Hours].[Work Code] 
WHERE [Project Hours].ID NOT IN (SELECT HoursID FROM tblInvoiceLineItems where hoursID is not null) AND (
    (([Project Hours].Project) = [Enter ID]) 
    AND (
     ([Project Hours].ID) IN (
      SELECT DISTINCT [Project Hours].ID 
      FROM [Project Hours] 
      ) 
     ) 
    ); 

Я добавил hoursid не равно нулю на не как не делает некоторые «интересные» вещи, если есть нулевое значение там вообще.

+0

Спасибо за предложение использовать NOT NULL, я попытаюсь поместить его в созданное мной решение, которое читается после WHERE: ((([Project Hours] .Project) = [Enter ID]) AND («ID "<> (SELECT [tblInvoiceLineItems]. [HoursID] FROM [tblInvoiceLineItems]))); НЕ ВХОДИТ в соответствие с <> и должен ли я использовать это вместо этого? –

+0

Еще раз спасибо Andrew! Я удалил свое решение и протестировал его, и он работал нормально, и я думаю, что ваше решение лучше, поэтому я использую его. Я также адаптировал его для работы с таблицей таблиц затрат проекта, а также следующим образом: ГДЕ [Затраты проекта] .ID NOT IN (SELECT ExpensesID FROM tblInvoiceLineItems, где ExpensesID не является нулевым) И (([Расходы проекта] .Project) = [Enter ID]); Надеюсь, я могу помочь кому-то другому, как вы мне помогли. Я, конечно, ценю это, и я отвечаю на любые вопросы. , о любых тем, которые я могу. –

Смежные вопросы