Ошибка доступа VBA при вставке длинного текста в таблицу - PullRequest
0 голосов
/ 15 марта 2019

В Access у меня есть 2 таблицы, table_A и table_B.В столбце col2 из table_A в качестве значения ячейки указана функция R.

mdPatternChart<-function (x, Str_PathFile) 
{
  if (!(is.matrix(x) || is.data.frame(x))) 
    stop("Data should be a matrix or dataframe")
  if (ncol(x) < 2) 
    stop("Data should have at least two columns")
  R <- is.na(x)
  nmis <- colSums(R)
  R <- matrix(R[, order(nmis)], dim(x))
  pat <- apply(R, 1, function(x) paste(as.numeric(x), collapse = ""))
  sortR <- matrix(R[order(pat), ], dim(x))

  if (nrow(x) == 1) {
    mpat <- is.na(x)
  } else {
    mpat <- sortR[!duplicated(sortR), ]
  }

  if (all(!is.na(x))) {    cat(" /\\     /\\\n{  `---'  }\n{  O   O  }\n==>  V <==")
    cat("  No need for mice. This data set is completely observed.\n")
    cat(" \\  \\|/  /\n  `-----'\n\n")
    mpat <- t(as.matrix(mpat, byrow = TRUE))
    rownames(mpat) <- table(pat)
  } else {
    if (is.null(dim(mpat))) {
      mpat <- t(as.matrix(mpat))
    }
    rownames(mpat) <- table(pat)
  }
  r <- cbind(abs(mpat - 1), rowSums(mpat))
  r <- rbind(r, c(nmis[order(nmis)], sum(nmis)))

  png(file=paste(Str_PathFile,".png",sep=""),bg="transparent")
    plot.new()
    if (is.null(dim(sortR[!duplicated(sortR), ]))) {
      R <- t(as.matrix(r[1:nrow(r) - 1, 1:ncol(r) - 1]))
    } else {
      if (is.null(dim(R))) {
        R <- t(as.matrix(R))
      }
      R <- r[1:nrow(r) - 1, 1:ncol(r) - 1]
    }
    par(mar = rep(0, 4))
    plot.window(xlim = c(-1, ncol(R) + 1), ylim = c(-1, nrow(R) + 
                                                      1), asp = 1)
    M <- cbind(c(row(R)), c(col(R))) - 1
    shade <- ifelse(R[nrow(R):1, ], mdc(1), mdc(2))
    rect(M[, 2], M[, 1], M[, 2] + 1, M[, 1] + 1, col = shade)
    adj = c(0, 0.5)
    srt = 90
    for (i in 1:ncol(R)) {
      text(i - 0.5, nrow(R) + 0.3, colnames(r)[i], adj = adj, 
           srt = srt)
      text(i - 0.5, -0.3, nmis[order(nmis)][i])
    }
    for (i in 1:nrow(R)) {
      text(ncol(R) + 0.3, i - 0.5, r[(nrow(r) - 1):1, ncol(r)][i], 
           adj = 0)
      text(-0.3, i - 0.5, rownames(r)[(nrow(r) - 1):1][i], 
           adj = 1)
    }
    text(ncol(R) + 0.3, -0.3, r[nrow(r), ncol(r)])
    dev.off()
}

Теперь я хотел бы вставить это в col2 таблицы_B.Col2 из обеих таблиц memo.Он работает как

CurrentDb.Execute "insert into Table_B (Col1,Col2) select Col1,Col2 from Table_A"

, но не работает, если я использую DAO.recordset, как показано ниже.

CurrentDb.Execute "insert into Table_B (Co1,Col2) values (2,'" & Rs_TableA.Fields("Col2") & "')"

И он выдал ошибку времени выполнения 3075, говорящую о том, что с синтаксисом что-то не так.Я заменил!и "в функции, но она не сработала. Я также попытался сохранить ее значение в строковой переменной перед вставкой, и она тоже не сработала. Поскольку мне нужно перебрать таблицу _, кто-нибудь может помочь? Спасибо!

enter image description here

1 Ответ

0 голосов
/ 15 марта 2019

Текст функции содержит апострофы и символы кавычек. Эти символы имеют особое значение в инструкциях SQL. Подзапрос SELECT не будет иметь проблемы, но созданное значение извлечения SQL из набора записей пытается обработать их как специальные символы, а не как простой текст. Это приводит к тому, что скомпилированный оператор является бессмысленным для механизма SQL. Обзор Как мне избежать одиночной кавычки в SQL Server? .

Варианты обработки:

  1. Replace(Replace([fieldname], "'", "''"), Chr(34), Chr(34) & Chr(34))

  2. Откройте исходный набор записей и целевой набор записей, выполните цикл по источнику и используйте AddNew и Update для записи записей в целевой

  3. Возможно, версия подзапроса SELECT действительно будет соответствовать требованию, и если идентификатор должен предоставляться динамически с помощью текстового поля:
    CurrentDb.Execute "INSERT INTO Table_B (Col1,Col2) SELECT " & Me.tbxID & " As C1, Col2 FROM Table_A"

Кроме того, есть 2 наклонных апострофа, где я думаю, что должны быть нормальные апострофы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...